After this commit applications needs to call av_format_inject_global_side_data() or handle AVStream side data by some other means if they want it not to be lost. This fixes a API incompatibility with libav. libav API does not allow the data to be passed through AVPackets Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.3
| @@ -15,6 +15,9 @@ libavutil: 2012-10-22 | |||||
| API changes, most recent first: | API changes, most recent first: | ||||
| 2014-04-XX - xxxxxxx - lavf xx.xx.1xx - avformat.h | |||||
| Add av_format_inject_global_side_data() | |||||
| 2014-04-12 - xxxxxxx - lavu 52.76.100 - log.h | 2014-04-12 - xxxxxxx - lavu 52.76.100 - log.h | ||||
| Add av_log_get_flags() | Add av_log_get_flags() | ||||
| @@ -2752,6 +2752,8 @@ static int read_thread(void *arg) | |||||
| if (genpts) | if (genpts) | ||||
| ic->flags |= AVFMT_FLAG_GENPTS; | ic->flags |= AVFMT_FLAG_GENPTS; | ||||
| av_format_inject_global_side_data(ic); | |||||
| opts = setup_find_stream_info_opts(ic, codec_opts); | opts = setup_find_stream_info_opts(ic, codec_opts); | ||||
| orig_nb_streams = ic->nb_streams; | orig_nb_streams = ic->nb_streams; | ||||
| @@ -862,6 +862,8 @@ typedef struct AVStream { | |||||
| * - muxing: May be set by the caller before avformat_write_header(). | * - muxing: May be set by the caller before avformat_write_header(). | ||||
| * | * | ||||
| * Freed by libavformat in avformat_free_context(). | * Freed by libavformat in avformat_free_context(). | ||||
| * | |||||
| * @see av_format_inject_global_side_data() | |||||
| */ | */ | ||||
| AVPacketSideData *side_data; | AVPacketSideData *side_data; | ||||
| /** | /** | ||||
| @@ -1043,7 +1045,7 @@ typedef struct AVStream { | |||||
| /** | /** | ||||
| * Internal data to inject global side data | * Internal data to inject global side data | ||||
| */ | */ | ||||
| int global_side_data_injected; | |||||
| int inject_global_side_data; | |||||
| } AVStream; | } AVStream; | ||||
| @@ -1612,6 +1614,12 @@ void av_format_set_opaque(AVFormatContext *s, void *opaque); | |||||
| av_format_control_message av_format_get_control_message_cb(const AVFormatContext *s); | av_format_control_message av_format_get_control_message_cb(const AVFormatContext *s); | ||||
| void av_format_set_control_message_cb(AVFormatContext *s, av_format_control_message callback); | void av_format_set_control_message_cb(AVFormatContext *s, av_format_control_message callback); | ||||
| /** | |||||
| * This function will cause global side data to be injected in the next packet | |||||
| * of each stream as well as after any subsequent seek. | |||||
| */ | |||||
| void av_format_inject_global_side_data(AVFormatContext *s); | |||||
| /** | /** | ||||
| * Returns the method used to set ctx->duration. | * Returns the method used to set ctx->duration. | ||||
| * | * | ||||
| @@ -52,6 +52,8 @@ struct AVFormatInternal { | |||||
| * Muxing only. | * Muxing only. | ||||
| */ | */ | ||||
| int nb_interleaved_streams; | int nb_interleaved_streams; | ||||
| int inject_global_side_data; | |||||
| }; | }; | ||||
| #ifdef __GNUC__ | #ifdef __GNUC__ | ||||
| @@ -110,6 +110,16 @@ MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding) | |||||
| MAKE_ACCESSORS(AVFormatContext, format, void *, opaque) | MAKE_ACCESSORS(AVFormatContext, format, void *, opaque) | ||||
| MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb) | MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb) | ||||
| void av_format_inject_global_side_data(AVFormatContext *s) | |||||
| { | |||||
| int i; | |||||
| s->internal->inject_global_side_data = 1; | |||||
| for (i = 0; i < s->nb_streams; i++) { | |||||
| AVStream *st = s->streams[i]; | |||||
| st->inject_global_side_data = 1; | |||||
| } | |||||
| } | |||||
| static AVCodec *find_decoder(AVFormatContext *s, AVStream *st, enum AVCodecID codec_id) | static AVCodec *find_decoder(AVFormatContext *s, AVStream *st, enum AVCodecID codec_id) | ||||
| { | { | ||||
| if (st->codec->codec) | if (st->codec->codec) | ||||
| @@ -1527,7 +1537,7 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt) | |||||
| st->skip_samples = 0; | st->skip_samples = 0; | ||||
| } | } | ||||
| if (!st->global_side_data_injected) { | |||||
| if (st->inject_global_side_data) { | |||||
| for (i = 0; i < st->nb_side_data; i++) { | for (i = 0; i < st->nb_side_data; i++) { | ||||
| AVPacketSideData *src_sd = &st->side_data[i]; | AVPacketSideData *src_sd = &st->side_data[i]; | ||||
| uint8_t *dst_data; | uint8_t *dst_data; | ||||
| @@ -1543,7 +1553,7 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt) | |||||
| memcpy(dst_data, src_sd->data, src_sd->size); | memcpy(dst_data, src_sd->data, src_sd->size); | ||||
| } | } | ||||
| st->global_side_data_injected = 1; | |||||
| st->inject_global_side_data = 0; | |||||
| } | } | ||||
| if (!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA)) | if (!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA)) | ||||
| @@ -1717,7 +1727,8 @@ void ff_read_frame_flush(AVFormatContext *s) | |||||
| for (j = 0; j < MAX_REORDER_DELAY + 1; j++) | for (j = 0; j < MAX_REORDER_DELAY + 1; j++) | ||||
| st->pts_buffer[j] = AV_NOPTS_VALUE; | st->pts_buffer[j] = AV_NOPTS_VALUE; | ||||
| st->global_side_data_injected = 0; | |||||
| if (s->internal->inject_global_side_data) | |||||
| st->inject_global_side_data = 1; | |||||
| } | } | ||||
| } | } | ||||
| @@ -3690,6 +3701,8 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c) | |||||
| st->info->fps_first_dts = AV_NOPTS_VALUE; | st->info->fps_first_dts = AV_NOPTS_VALUE; | ||||
| st->info->fps_last_dts = AV_NOPTS_VALUE; | st->info->fps_last_dts = AV_NOPTS_VALUE; | ||||
| st->inject_global_side_data = s->internal->inject_global_side_data; | |||||
| s->streams[s->nb_streams++] = st; | s->streams[s->nb_streams++] = st; | ||||
| return st; | return st; | ||||
| } | } | ||||