
/*
 * Copyright (C) Gnolizuh
 * Copyright (C) Winshining
 */

#ifndef _NGX_RTMP_GOP_CACHE_H_INCLUDE_
#define _NGX_RTMP_GOP_CACHE_H_INCLUDE_


#define NGX_GOP_CACHE_POOL_CREATE_SIZE          4096


typedef struct ngx_rtmp_gop_frame_s ngx_rtmp_gop_frame_t;
typedef struct ngx_rtmp_gop_cache_s ngx_rtmp_gop_cache_t;


struct ngx_rtmp_gop_frame_s {
    ngx_rtmp_header_t     h;
    ngx_uint_t            prio;
    ngx_chain_t          *frame;
    ngx_rtmp_gop_frame_t *next;
};


struct ngx_rtmp_gop_cache_s {
    ngx_rtmp_gop_frame_t  *frame_head;
    ngx_rtmp_gop_frame_t  *frame_tail;
    ngx_rtmp_gop_cache_t  *next;

    ngx_chain_t           *video_seq_header;
    ngx_chain_t           *audio_seq_header;
    ngx_chain_t           *meta;

    ngx_uint_t             meta_version;

    ngx_int_t              video_frame_in_this;
    ngx_int_t              audio_frame_in_this;
};


typedef struct ngx_rtmp_gop_cache_app_conf_s {
    ngx_flag_t       gop_cache;
    size_t           gop_cache_count;
    size_t           gop_max_frame_count;
    size_t           gop_max_video_count;
    size_t           gop_max_audio_count;
} ngx_rtmp_gop_cache_app_conf_t;


typedef struct ngx_rtmp_gop_cache_ctx_s {
    ngx_pool_t                 *pool;
    ngx_rtmp_gop_cache_t       *cache_head;
    ngx_rtmp_gop_cache_t       *cache_tail;
    ngx_rtmp_gop_cache_t       *free_cache;
    ngx_rtmp_gop_frame_t       *free_frame;

    size_t                      gop_cache_count;
    size_t                      video_frame_in_all;
    size_t                      audio_frame_in_all;
} ngx_rtmp_gop_cache_ctx_t;


#endif

