/* * GPAC - Multimedia Framework C SDK * * Authors: Arash Shafiei * Copyright (c) Telecom ParisTech 2000-2013 * All rights reserved * * This file is part of GPAC / dashcast * * GPAC is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GPAC is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef VIDEO_DATA_H_ #define VIDEO_DATA_H_ #include "../../modules/ffmpeg_in/ffmpeg_in.h" #include "libavcodec/avcodec.h" #include "libswscale/swscale.h" #include "libav_compat.h" #include "circular_buffer.h" #include <time.h> //anything different is broken in dash cast (random frame inversions at encoding time ...) #define VIDEO_CB_DEFAULT_SIZE 1 /* * This structure corresponds to an * entry of video configuration in the * configuration file. */ typedef struct { /* video file name */ char filename[GF_MAX_PATH]; /* video format */ char format[GF_MAX_PATH]; /* video format */ char pixel_format[GF_MAX_PATH]; /* v4l2 format */ char v4l2f[GF_MAX_PATH]; /* left crop */ int crop_x; /* top crop */ int crop_y; /* video final width */ int width; /* video final height */ int height; /* video bitrate */ int bitrate; /* video frame rate */ int framerate; /* video codec */ char codec[GF_MAX_PATH]; /* RFC6381 codec name, only valid when VIDEO_MUXER == GPAC_INIT_VIDEO_MUXER_AVC1 */ char codec6381[GF_MAX_PATH]; /* custom parameter to be passed directly to the encoder - free it once you're done */ char custom[GF_MAX_PATH]; /*low delay is used*/ int low_delay; /*demuxer buffer size or 0 if default FFmpeg one is used*/ int demux_buffer_size; /* used for source switching */ char source_id[GF_MAX_PATH]; time_t start_time; time_t end_time; //copy over from source file AVRational time_base; u64 frame_duration; } VideoDataConf; typedef struct { /* Width, height and pixel format of the input video. */ int width; int height; int crop_x, crop_y; int pix_fmt; AVRational sar; } VideoInputProp; /* * VideoInputData is designed to keep the data * of input video in a circular buffer. * The circular buffer has its own mechanism for synchronization. */ typedef struct { /* The circular buffer of the video frames after decoding. */ CircularBuffer circular_buf; /* The user of circular buffer has an index to it, which is in this variable. */ Producer producer; VideoInputProp *vprop; /* Width, height and pixel format of the input video */ //int width; //int height; //int pix_fmt; u64 frame_duration; } VideoInputData; /* * Each node in a circular buffer is a pointer. * To use the circular buffer for video frame we must * define the node. VideoDataNode simply contains * an AVFrame. */ typedef struct { AVFrame * vframe; int source_number; uint8_t nb_raw_frames_ref; AVPacket raw_packet; u64 frame_ntp, frame_utc; } VideoDataNode; void dc_video_data_set_default(VideoDataConf *video_data_conf); /* * Initialize a VideoInputData. * * @param video_input_data [out] is the structure to be initialize. * @param width [in] input video width * @param height [in] input video height * @param pixfmt [in] input video pixel format * @param num_consumers [in] contains information on the number of users of circular buffer; * which means the number of video encoders. * @param live [in] indicates the system is live * * @return 0 on success, -1 on failure. * * @note Must use dc_video_data_destroy to free memory. */ int dc_video_input_data_init(VideoInputData *video_input_data,/* int width, int height, int pix_fmt,*/ int num_consumers, int mode, int num_producers, int video_cb_size); /* * Set properties for a VideoInputData. */ void dc_video_input_data_set_prop(VideoInputData *video_input_data, int index, int width, int height, int crop_x, int crop_y, int pix_fmt, AVRational sar); /* * Destroy a VideoInputData. * * @param video_input_data [in] the structure to be destroyed. */ void dc_video_input_data_destroy(VideoInputData *video_input_data); /* * Signal to all the users of the circular buffer in the VideoInputData * which the current node is the last node to consume. * * @param video_input_data [in] the structure to be signaled on. */ void dc_video_input_data_end_signal(VideoInputData *video_input_data); #endif /* VIDEO_DATA_H_ */