On 11/4/2016 9:43 AM, Michael Niedermayer wrote: > The bitstream filters do not work with merged in side data > > This leaves the input packet split if it is being split. > It could be merged again, if thats preferred ? That would involve > an extra malloc and memcpy though
Since side data is being split and merged at a latter point during av_interleaved_write_frame() and av_write_frame() calls, maybe we could just move the relevant code before the autobsf kicks in. See attached patch. FATE passes and the sample from ticket 5927 works with autobsf, same as with your patch. It doesn't change ffmpeg.c manual bsf's behavior, though. For that your commit from yesterday is still needed.
>From 44fbcbd855d259126d889e5281e64c8988e57f18 Mon Sep 17 00:00:00 2001 From: James Almer <jamr...@gmail.com> Date: Fri, 4 Nov 2016 12:48:20 -0300 Subject: [PATCH] avformat/mux: split side data earlier in av_write_frame and av_interleaved_write_frame Similarly, merge it back before returning. This fixes ticket #5927. Signed-off-by: James Almer <jamr...@gmail.com> --- libavformat/mux.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/libavformat/mux.c b/libavformat/mux.c index 2dac381..816e856 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -692,7 +692,7 @@ FF_ENABLE_DEPRECATION_WARNINGS */ static int write_packet(AVFormatContext *s, AVPacket *pkt) { - int ret, did_split; + int ret; int64_t pts_backup, dts_backup; pts_backup = pkt->pts; @@ -755,8 +755,6 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) } } - did_split = av_packet_split_side_data(pkt); - if (!s->internal->header_written) { ret = s->internal->write_header_ret ? s->internal->write_header_ret : write_header_internal(s); if (ret < 0) @@ -780,9 +778,6 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) } fail: - if (did_split) - av_packet_merge_side_data(pkt); - if (ret < 0) { pkt->pts = pts_backup; pkt->dts = dts_backup; @@ -918,7 +913,7 @@ static int do_packet_auto_bsf(AVFormatContext *s, AVPacket *pkt) { int av_write_frame(AVFormatContext *s, AVPacket *pkt) { - int ret; + int ret, did_split = 0; ret = prepare_input_packet(s, pkt); if (ret < 0) @@ -939,7 +934,8 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt) return ret; } return 1; - } + } else + did_split = av_packet_split_side_data(pkt); ret = do_packet_auto_bsf(s, pkt); if (ret <= 0) @@ -958,6 +954,10 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt) if (ret >= 0) s->streams[pkt->stream_index]->nb_frames++; + + if (did_split) + av_packet_merge_side_data(pkt); + return ret; } @@ -1224,7 +1224,7 @@ static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, in int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt) { - int ret, flush = 0; + int ret, did_split = 0, flush = 0; ret = prepare_input_packet(s, pkt); if (ret < 0) @@ -1233,6 +1233,8 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt) if (pkt) { AVStream *st = s->streams[pkt->stream_index]; + did_split = av_packet_split_side_data(pkt); + ret = do_packet_auto_bsf(s, pkt); if (ret == 0) return 0; @@ -1280,6 +1282,9 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt) return s->pb->error; } fail: + if (did_split) + av_packet_merge_side_data(pkt); + av_packet_unref(pkt); return ret; } -- 2.10.1
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel