[FFmpeg-cvslog] make swresample optional for ffmpeg
ffmpeg | branch: master | Paul B Mahol | Thu Apr 12 22:15:05 2018 +0200| [0b360cae1cb790fe34e681a6a674990d48d415d9] | committer: Paul B Mahol make swresample optional for ffmpeg Signed-off-by: Paul B Mahol > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=0b360cae1cb790fe34e681a6a674990d48d415d9 --- configure| 2 +- fftools/ffmpeg_opt.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/configure b/configure index dee507cb6a..9fa1665496 100755 --- a/configure +++ b/configure @@ -3459,7 +3459,7 @@ avfilter_extralibs="pthreads_extralibs" avutil_extralibs="d3d11va_extralibs nanosleep_extralibs pthreads_extralibs vaapi_drm_extralibs vaapi_x11_extralibs vdpau_x11_extralibs" # programs -ffmpeg_deps="avcodec avfilter avformat swresample" +ffmpeg_deps="avcodec avfilter avformat" ffmpeg_select="aformat_filter anull_filter atrim_filter format_filter null_filter trim_filter" diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index d7a7eb0662..8ae68aec0e 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -3157,7 +3157,9 @@ void show_help_default(const char *opt, const char *arg) #if CONFIG_SWSCALE show_help_children(sws_get_class(), flags); #endif +#if CONFIG_SWRESAMPLE show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM); +#endif show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM); show_help_children(av_bsf_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_BSF_PARAM); } ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avfiler/vf_mix: fix crash with >8 bit depth
ffmpeg | branch: master | Paul B Mahol | Wed Apr 25 14:08:21 2018 +0200| [a12899ad9b4d7de3cc255e8944094c8ce8d2aa31] | committer: Paul B Mahol avfiler/vf_mix: fix crash with >8 bit depth Signed-off-by: Paul B Mahol > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=a12899ad9b4d7de3cc255e8944094c8ce8d2aa31 --- libavfilter/vf_mix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavfilter/vf_mix.c b/libavfilter/vf_mix.c index 261ab066ef..a548f2663f 100644 --- a/libavfilter/vf_mix.c +++ b/libavfilter/vf_mix.c @@ -151,7 +151,7 @@ static int process_frame(FFFrameSync *fs) uint16_t *dst = (uint16_t *)out->data[p]; for (y = 0; y < s->height[p]; y++) { -for (x = 0; x < s->linesize[p]; x++) { +for (x = 0; x < s->linesize[p] / 2; x++) { int val = 0; for (i = 0; i < s->nb_inputs; i++) { ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avformat/yuv4mpegdec: fix seeking backwards
ffmpeg | branch: master | Paul B Mahol | Wed Apr 25 18:30:46 2018 +0200| [b2570afde3623ef2806b82f1d4e7428283b32491] | committer: Paul B Mahol avformat/yuv4mpegdec: fix seeking backwards Signed-off-by: Paul B Mahol > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b2570afde3623ef2806b82f1d4e7428283b32491 --- libavformat/yuv4mpegdec.c| 11 ++- tests/ref/seek/lavf-yuv4mpeg | 45 +++- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/libavformat/yuv4mpegdec.c b/libavformat/yuv4mpegdec.c index ff0125e4cf..8662a42a4c 100644 --- a/libavformat/yuv4mpegdec.c +++ b/libavformat/yuv4mpegdec.c @@ -314,7 +314,16 @@ static int yuv4_read_packet(AVFormatContext *s, AVPacket *pkt) static int yuv4_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flags) { -if (avio_seek(s->pb, pts * s->packet_size + s->internal->data_offset, SEEK_SET) < 0) +AVStream *st = s->streams[0]; +int64_t pos; + +pos = av_rescale_rnd(pts * s->packet_size, + st->time_base.num, + st->time_base.den * s->packet_size, + (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP); +pos *= s->packet_size; + +if (avio_seek(s->pb, pos + s->internal->data_offset, SEEK_SET) < 0) return -1; return 0; } diff --git a/tests/ref/seek/lavf-yuv4mpeg b/tests/ref/seek/lavf-yuv4mpeg index 6be9ba9480..15d4d8c8c1 100644 --- a/tests/ref/seek/lavf-yuv4mpeg +++ b/tests/ref/seek/lavf-yuv4mpeg @@ -1,45 +1,48 @@ ret: 0 st: 0 flags:1 dts: 0.00 pts: 0.00 pos: 64 size:152064 ret:-1 st:-1 flags:0 ts:-1.00 ret: 0 st:-1 flags:1 ts: 1.894167 -ret:-EOF +ret: 0 st: 0 flags:1 dts: 0.04 pts: 0.04 pos: 152134 size:152064 ret: 0 st: 0 flags:0 ts: 0.80 -ret: 0 st: 0 flags:1 dts: 0.80 pts: 0.80 pos:3041464 size:152064 +ret: 0 st: 0 flags:1 dts: 0.04 pts: 0.04 pos: 152134 size:152064 ret:-1 st: 0 flags:1 ts:-0.32 ret: 0 st:-1 flags:0 ts: 2.576668 -ret:-EOF +ret: 0 st: 0 flags:1 dts: 0.12 pts: 0.12 pos: 456274 size:152064 ret: 0 st:-1 flags:1 ts: 1.470835 -ret:-EOF +ret: 0 st: 0 flags:1 dts: 0.04 pts: 0.04 pos: 152134 size:152064 ret: 0 st: 0 flags:0 ts: 0.36 -ret: 0 st: 0 flags:1 dts: 0.36 pts: 0.36 pos:1368694 size:152064 +ret: 0 st: 0 flags:1 dts: 0.04 pts: 0.04 pos: 152134 size:152064 ret:-1 st: 0 flags:1 ts:-0.76 ret: 0 st:-1 flags:0 ts: 2.153336 -ret:-EOF +ret: 0 st: 0 flags:1 dts: 0.12 pts: 0.12 pos: 456274 size:152064 ret: 0 st:-1 flags:1 ts: 1.047503 -ret:-EOF -ret:-1 st: 0 flags:0 ts:-0.04 +ret: 0 st: 0 flags:1 dts: 0.04 pts: 0.04 pos: 152134 size:152064 +ret: 0 st: 0 flags:0 ts:-0.04 +ret: 0 st: 0 flags:1 dts: 0.00 pts: 0.00 pos: 64 size:152064 ret: 0 st: 0 flags:1 ts: 2.84 -ret:-EOF +ret: 0 st: 0 flags:1 dts: 0.08 pts: 0.08 pos: 304204 size:152064 ret: 0 st:-1 flags:0 ts: 1.730004 -ret:-EOF +ret: 0 st: 0 flags:1 dts: 0.08 pts: 0.08 pos: 304204 size:152064 ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 0 flags:1 dts: 0.64 pts: 0.64 pos:2433184 size:152064 -ret:-1 st: 0 flags:0 ts:-0.48 +ret: 0 st: 0 flags:1 dts: 0.00 pts: 0.00 pos: 64 size:152064 +ret: 0 st: 0 flags:0 ts:-0.48 +ret: 0 st: 0 flags:1 dts: 0.00 pts: 0.00 pos: 64 size:152064 ret: 0 st: 0 flags:1 ts: 2.40 -ret:-EOF +ret: 0 st: 0 flags:1 dts: 0.08 pts: 0.08 pos: 304204 size:152064 ret: 0 st:-1 flags:0 ts: 1.306672 -ret:-EOF +ret: 0 st: 0 flags:1 dts: 0.08 pts: 0.08 pos: 304204 size:152064 ret: 0 st:-1 flags:1 ts: 0.200839 -ret: 0 st: 0 flags:1 dts: 0.20 pts: 0.20 pos: 760414 size:152064 -ret:-1 st: 0 flags:0 ts:-0.92 +ret: 0 st: 0 flags:1 dts: 0.00 pts: 0.00 pos: 64 size:152064 +ret: 0 st: 0 flags:0 ts:-0.92 +ret: 0 st: 0 flags:1 dts: 0.00 pts: 0.00 pos: 64 size:152064 ret: 0 st: 0 flags:1 ts: 2.00 -ret:-EOF +ret: 0 st: 0 flags:1 dts: 0.08 pts: 0.08 pos: 304204 size:152064 ret: 0 st:-1 flags:0 ts: 0.883340 -ret: 0 st: 0 flags:1 dts: 0.88 pts: 0.88 pos:3345604 size:152064 +ret: 0 st: 0 flags:1 dts: 0.04 pts: 0.04 pos: 152134 size:152064 ret:-1 st:-1 flags:1 ts:-0.222493 ret: 0 st: 0 flags:0 ts: 2.68 -ret:-EOF +ret: 0 st: 0 flags:1 dts: 0.12 pts: 0.12 pos: 456274 size:152064 ret: 0 st: 0 flags:1 ts: 1.56 -ret:-EOF +ret: 0
[FFmpeg-cvslog] avcodec/mediacodecdec: use AV_TIME_BASE_Q
ffmpeg | branch: master | Aman Gupta | Tue Apr 24 13:45:30 2018 -0700| [7a4639b1eba31f88490c85663c75fb1414307680] | committer: Aman Gupta avcodec/mediacodecdec: use AV_TIME_BASE_Q Signed-off-by: Matthieu Bouron Signed-off-by: Jan Ekström Signed-off-by: Aman Gupta > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7a4639b1eba31f88490c85663c75fb1414307680 --- libavcodec/mediacodecdec_common.c | 8 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c index 0c27624dea..56b3c4fd1e 100644 --- a/libavcodec/mediacodecdec_common.c +++ b/libavcodec/mediacodecdec_common.c @@ -209,7 +209,7 @@ static int mediacodec_wrap_hw_buffer(AVCodecContext *avctx, if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) { frame->pts = av_rescale_q(info->presentationTimeUs, - av_make_q(1, 100), + AV_TIME_BASE_Q, avctx->pkt_timebase); } else { frame->pts = info->presentationTimeUs; @@ -298,7 +298,7 @@ static int mediacodec_wrap_sw_buffer(AVCodecContext *avctx, * * 0-sized avpackets are pushed to flush remaining frames at EOS */ if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) { frame->pts = av_rescale_q(info->presentationTimeUs, - av_make_q(1, 100), + AV_TIME_BASE_Q, avctx->pkt_timebase); } else { frame->pts = info->presentationTimeUs; @@ -610,7 +610,7 @@ int ff_mediacodec_dec_send(AVCodecContext *avctx, MediaCodecDecContext *s, uint32_t flags = ff_AMediaCodec_getBufferFlagEndOfStream(codec); if (s->surface) { -pts = av_rescale_q(pts, avctx->pkt_timebase, av_make_q(1, 100)); +pts = av_rescale_q(pts, avctx->pkt_timebase, AV_TIME_BASE_Q); } av_log(avctx, AV_LOG_DEBUG, "Sending End Of Stream signal\n"); @@ -634,7 +634,7 @@ int ff_mediacodec_dec_send(AVCodecContext *avctx, MediaCodecDecContext *s, offset += size; if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) { -pts = av_rescale_q(pts, avctx->pkt_timebase, av_make_q(1, 100)); +pts = av_rescale_q(pts, avctx->pkt_timebase, AV_TIME_BASE_Q); } status = ff_AMediaCodec_queueInputBuffer(codec, index, 0, size, pts, 0); ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/mediacodecdec: clarify delay_flush specific code
ffmpeg | branch: master | Aman Gupta | Mon Apr 23 19:21:19 2018 -0700| [6a7a84b2d11e6c5e2ca2023a6886ca75b8b10030] | committer: Aman Gupta avcodec/mediacodecdec: clarify delay_flush specific code As of 2a0eb8685, ff_mediacodec_dec_is_flushing() only returns true in delay_flush mode. Make this more obvious by adding delay_flush to the if statement. Signed-off-by: Matthieu Bouron Signed-off-by: Aman Gupta > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6a7a84b2d11e6c5e2ca2023a6886ca75b8b10030 --- libavcodec/mediacodecdec.c| 24 +++- libavcodec/mediacodecdec_common.c | 12 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c index 0d4a853f07..86ceee5a83 100644 --- a/libavcodec/mediacodecdec.c +++ b/libavcodec/mediacodecdec.c @@ -419,27 +419,9 @@ static int mediacodec_receive_frame(AVCodecContext *avctx, AVFrame *frame) MediaCodecH264DecContext *s = avctx->priv_data; int ret; -/* - * MediaCodec.flush() discards both input and output buffers, thus we - * need to delay the call to this function until the user has released or - * renderered the frames he retains. - * - * After we have buffered an input packet, check if the codec is in the - * flushing state. If it is, we need to call ff_mediacodec_dec_flush. - * - * ff_mediacodec_dec_flush returns 0 if the flush cannot be performed on - * the codec (because the user retains frames). The codec stays in the - * flushing state. - * - * ff_mediacodec_dec_flush returns 1 if the flush can actually be - * performed on the codec. The codec leaves the flushing state and can - * process again packets. - * - * ff_mediacodec_dec_flush returns a negative value if an error has - * occurred. - * - */ -if (ff_mediacodec_dec_is_flushing(avctx, s->ctx)) { +/* In delay_flush mode, wait until the user has released or rendered + all retained frames. */ +if (s->delay_flush && ff_mediacodec_dec_is_flushing(avctx, s->ctx)) { if (!ff_mediacodec_dec_flush(avctx, s->ctx)) { return AVERROR(EAGAIN); } diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c index e59cf19aad..0c27624dea 100644 --- a/libavcodec/mediacodecdec_common.c +++ b/libavcodec/mediacodecdec_common.c @@ -764,6 +764,18 @@ int ff_mediacodec_dec_receive(AVCodecContext *avctx, MediaCodecDecContext *s, return AVERROR(EAGAIN); } +/* +* ff_mediacodec_dec_flush returns 0 if the flush cannot be performed on +* the codec (because the user retains frames). The codec stays in the +* flushing state. +* +* ff_mediacodec_dec_flush returns 1 if the flush can actually be +* performed on the codec. The codec leaves the flushing state and can +* process again packets. +* +* ff_mediacodec_dec_flush returns a negative value if an error has +* occurred. +*/ int ff_mediacodec_dec_flush(AVCodecContext *avctx, MediaCodecDecContext *s) { if (!s->surface || atomic_load(&s->refcount) == 1) { ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/mediacodecdec: refactor pts handling
ffmpeg | branch: master | Aman Gupta | Tue Apr 24 13:51:15 2018 -0700| [d8e92a89edd8e73cdc7f125f078c576df10b66f2] | committer: Aman Gupta avcodec/mediacodecdec: refactor pts handling Also fixes a bug where EOS buffer was sent with incorrect pts when not using surface generation. Signed-off-by: Matthieu Bouron Signed-off-by: Aman Gupta > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d8e92a89edd8e73cdc7f125f078c576df10b66f2 --- libavcodec/mediacodecdec_common.c | 17 ++--- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c index 56b3c4fd1e..c0f0a6b983 100644 --- a/libavcodec/mediacodecdec_common.c +++ b/libavcodec/mediacodecdec_common.c @@ -571,6 +571,7 @@ int ff_mediacodec_dec_send(AVCodecContext *avctx, MediaCodecDecContext *s, FFAMediaCodec *codec = s->codec; int status; int64_t input_dequeue_timeout_us = INPUT_DEQUEUE_TIMEOUT_US; +int64_t pts; if (s->flushing) { av_log(avctx, AV_LOG_ERROR, "Decoder is flushing and cannot accept new buffer " @@ -605,14 +606,14 @@ int ff_mediacodec_dec_send(AVCodecContext *avctx, MediaCodecDecContext *s, return AVERROR_EXTERNAL; } +pts = pkt->pts; +if (pts != AV_NOPTS_VALUE && avctx->pkt_timebase.num && avctx->pkt_timebase.den) { +pts = av_rescale_q(pts, avctx->pkt_timebase, AV_TIME_BASE_Q); +} + if (need_draining) { -int64_t pts = pkt->pts; uint32_t flags = ff_AMediaCodec_getBufferFlagEndOfStream(codec); -if (s->surface) { -pts = av_rescale_q(pts, avctx->pkt_timebase, AV_TIME_BASE_Q); -} - av_log(avctx, AV_LOG_DEBUG, "Sending End Of Stream signal\n"); status = ff_AMediaCodec_queueInputBuffer(codec, index, 0, 0, pts, flags); @@ -627,16 +628,10 @@ int ff_mediacodec_dec_send(AVCodecContext *avctx, MediaCodecDecContext *s, s->draining = 1; break; } else { -int64_t pts = pkt->pts; - size = FFMIN(pkt->size - offset, size); memcpy(data, pkt->data + offset, size); offset += size; -if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) { -pts = av_rescale_q(pts, avctx->pkt_timebase, AV_TIME_BASE_Q); -} - status = ff_AMediaCodec_queueInputBuffer(codec, index, 0, size, pts, 0); if (status < 0) { av_log(avctx, AV_LOG_ERROR, "Failed to queue input buffer (status = %d)\n", status); ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/cbs_mpeg2: use memcpy when assembling fragments
ffmpeg | branch: master | James Almer | Mon Apr 23 23:39:54 2018 -0300| [0161d91db01ae0b5d516232d92764f5a898cedc6] | committer: James Almer avcodec/cbs_mpeg2: use memcpy when assembling fragments before: 419022 decicycles in assemble_fragment,2047 runs, 1 skips after: 104621 decicycles in assemble_fragment,2045 runs, 3 skips Benched with a 2 minutes long 720x480 DVD mpeg2 sample. Reviewed-by: Michael Niedermayer Signed-off-by: James Almer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=0161d91db01ae0b5d516232d92764f5a898cedc6 --- libavcodec/cbs_mpeg2.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libavcodec/cbs_mpeg2.c b/libavcodec/cbs_mpeg2.c index bfb64a0851..94b9591b21 100644 --- a/libavcodec/cbs_mpeg2.c +++ b/libavcodec/cbs_mpeg2.c @@ -362,7 +362,7 @@ static int cbs_mpeg2_assemble_fragment(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag) { uint8_t *data; -size_t size, dp, sp; +size_t size, dp; int i; size = 0; @@ -382,8 +382,8 @@ static int cbs_mpeg2_assemble_fragment(CodedBitstreamContext *ctx, data[dp++] = 0; data[dp++] = 1; -for (sp = 0; sp < unit->data_size; sp++) -data[dp++] = unit->data[sp]; +memcpy(data + dp, unit->data, unit->data_size); +dp += unit->data_size; } av_assert0(dp == size); ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/mpeg4_unpack_bframes: cache input packets directly
ffmpeg | branch: master | James Almer | Tue Mar 20 21:59:10 2018 -0300| [bd90a2ec04d7b3fc370501731f8978681e254645] | committer: James Almer avcodec/mpeg4_unpack_bframes: cache input packets directly Avoids unnecessary allocs+copies and makes the code slightly simpler. Signed-off-by: James Almer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=bd90a2ec04d7b3fc370501731f8978681e254645 --- libavcodec/mpeg4_unpack_bframes_bsf.c | 56 --- 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/libavcodec/mpeg4_unpack_bframes_bsf.c b/libavcodec/mpeg4_unpack_bframes_bsf.c index 3a0ba105f5..c2b779a9d5 100644 --- a/libavcodec/mpeg4_unpack_bframes_bsf.c +++ b/libavcodec/mpeg4_unpack_bframes_bsf.c @@ -24,8 +24,7 @@ #include "mpeg4video.h" typedef struct UnpackBFramesBSFContext { -uint8_t *b_frame_buf; -int b_frame_buf_size; +AVPacket *b_frame; } UnpackBFramesBSFContext; /* search next start code */ @@ -71,18 +70,6 @@ static void scan_buffer(const uint8_t *buf, int buf_size, } } -/* allocate new buffer and copy size bytes from src */ -static uint8_t *create_new_buffer(const uint8_t *src, int size) { -uint8_t *dst = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE); - -if (dst) { -memcpy(dst, src, size); -memset(dst + size, 0, AV_INPUT_BUFFER_PADDING_SIZE); -} - -return dst; -} - static int mpeg4_unpack_bframes_filter(AVBSFContext *ctx, AVPacket *out) { UnpackBFramesBSFContext *s = ctx->priv_data; @@ -97,20 +84,18 @@ static int mpeg4_unpack_bframes_filter(AVBSFContext *ctx, AVPacket *out) av_log(ctx, AV_LOG_DEBUG, "Found %d VOP startcode(s) in this packet.\n", nb_vop); if (pos_vop2 >= 0) { -if (s->b_frame_buf) { +if (s->b_frame->data) { av_log(ctx, AV_LOG_WARNING, "Missing one N-VOP packet, discarding one B-frame.\n"); -av_freep(&s->b_frame_buf); -s->b_frame_buf_size = 0; +av_packet_unref(s->b_frame); } /* store the packed B-frame in the BSFContext */ -s->b_frame_buf_size = in->size - pos_vop2; -s->b_frame_buf = create_new_buffer(in->data + pos_vop2, s->b_frame_buf_size); -if (!s->b_frame_buf) { -s->b_frame_buf_size = 0; -ret = AVERROR(ENOMEM); +ret = av_packet_ref(s->b_frame, in); +if (ret < 0) { goto fail; } +s->b_frame->size -= pos_vop2; +s->b_frame->data += pos_vop2; } if (nb_vop > 2) { @@ -118,31 +103,22 @@ static int mpeg4_unpack_bframes_filter(AVBSFContext *ctx, AVPacket *out) "Found %d VOP headers in one packet, only unpacking one.\n", nb_vop); } -if (nb_vop == 1 && s->b_frame_buf) { +if (nb_vop == 1 && s->b_frame->data) { /* use frame from BSFContext */ +av_packet_move_ref(out, s->b_frame); + +/* use properties from current input packet */ ret = av_packet_copy_props(out, in); if (ret < 0) { goto fail; } -ret = av_packet_from_data(out, s->b_frame_buf, s->b_frame_buf_size); -if (ret < 0) { -goto fail; -} if (in->size <= MAX_NVOP_SIZE) { /* N-VOP */ av_log(ctx, AV_LOG_DEBUG, "Skipping N-VOP.\n"); -s->b_frame_buf = NULL; -s->b_frame_buf_size = 0; } else { /* copy packet into BSFContext */ -s->b_frame_buf_size = in->size; -s->b_frame_buf = create_new_buffer(in->data, in->size); -if (!s->b_frame_buf) { -s->b_frame_buf_size = 0; -ret = AVERROR(ENOMEM); -goto fail; -} +av_packet_move_ref(s->b_frame, in); } } else if (nb_vop >= 2) { /* use first frame of the packet */ @@ -171,6 +147,12 @@ fail: static int mpeg4_unpack_bframes_init(AVBSFContext *ctx) { +UnpackBFramesBSFContext *s = ctx->priv_data; + +s->b_frame = av_packet_alloc(); +if (!s->b_frame) +return AVERROR(ENOMEM); + if (ctx->par_in->extradata) { int pos_p_ext = -1; scan_buffer(ctx->par_in->extradata, ctx->par_in->extradata_size, &pos_p_ext, NULL, NULL); @@ -187,7 +169,7 @@ static int mpeg4_unpack_bframes_init(AVBSFContext *ctx) static void mpeg4_unpack_bframes_close(AVBSFContext *bsfc) { UnpackBFramesBSFContext *ctx = bsfc->priv_data; -av_freep(&ctx->b_frame_buf); +av_packet_free(&ctx->b_frame); } static const enum AVCodecID codec_ids[] = { ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/vc1: re-implement and expand VC-1 overlap smoothing
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 20:58:31 2018 +0200| [5e5c9f1804bf1c0aec157a4f2593fa30f7afa7f7] | committer: Paul B Mahol avcodec/vc1: re-implement and expand VC-1 overlap smoothing The existing implementation did overlap smoothing for progressive frames only. This rewritten version implements overlap smoothing for all applicable frame types for both progessive and frame/field-interlace. Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5e5c9f1804bf1c0aec157a4f2593fa30f7afa7f7 --- libavcodec/vc1.h| 2 + libavcodec/vc1_loopfilter.c | 94 + 2 files changed, 96 insertions(+) diff --git a/libavcodec/vc1.h b/libavcodec/vc1.h index 8fc0729cb8..85504c2f9f 100644 --- a/libavcodec/vc1.h +++ b/libavcodec/vc1.h @@ -425,6 +425,8 @@ void ff_vc1_decode_blocks(VC1Context *v); void ff_vc1_loop_filter_iblk(VC1Context *v, int pq); void ff_vc1_loop_filter_iblk_delayed(VC1Context *v, int pq); void ff_vc1_smooth_overlap_filter_iblk(VC1Context *v); +void ff_vc1_i_overlap_filter(VC1Context *v); +void ff_vc1_p_overlap_filter(VC1Context *v); void ff_vc1_apply_p_loop_filter(VC1Context *v); void ff_vc1_mc_1mv(VC1Context *v, int dir); diff --git a/libavcodec/vc1_loopfilter.c b/libavcodec/vc1_loopfilter.c index 025776bac9..3122b1a258 100644 --- a/libavcodec/vc1_loopfilter.c +++ b/libavcodec/vc1_loopfilter.c @@ -208,6 +208,100 @@ void ff_vc1_smooth_overlap_filter_iblk(VC1Context *v) } } +static av_always_inline void vc1_h_overlap_filter(VC1Context *v, int16_t (*left_block)[64], + int16_t (*right_block)[64], int block_num) +{ +if (left_block != right_block || (block_num & 5) == 1) { +if (block_num > 3) +v->vc1dsp.vc1_h_s_overlap(left_block[block_num], right_block[block_num]); +else if (block_num & 1) +v->vc1dsp.vc1_h_s_overlap(right_block[block_num - 1], right_block[block_num]); +else +v->vc1dsp.vc1_h_s_overlap(left_block[block_num + 1], right_block[block_num]); +} +} + +static av_always_inline void vc1_v_overlap_filter(VC1Context *v, int16_t (*top_block)[64], + int16_t (*bottom_block)[64], int block_num) +{ +if (top_block != bottom_block || block_num & 2) { +if (block_num > 3) +v->vc1dsp.vc1_v_s_overlap(top_block[block_num], bottom_block[block_num]); +else if (block_num & 2) +v->vc1dsp.vc1_v_s_overlap(bottom_block[block_num - 2], bottom_block[block_num]); +else +v->vc1dsp.vc1_v_s_overlap(top_block[block_num + 2], bottom_block[block_num]); +} +} + +void ff_vc1_i_overlap_filter(VC1Context *v) +{ +MpegEncContext *s = &v->s; +int16_t (*topleft_blk)[64], (*top_blk)[64], (*left_blk)[64], (*cur_blk)[64]; +int block_count = CONFIG_GRAY && (s->avctx->flags & AV_CODEC_FLAG_GRAY) ? 4 : 6; +int mb_pos = s->mb_x + s->mb_y * s->mb_stride; +int i; + +topleft_blk = v->block[v->topleft_blk_idx]; +top_blk = v->block[v->top_blk_idx]; +left_blk = v->block[v->left_blk_idx]; +cur_blk = v->block[v->cur_blk_idx]; + +/* Within a MB, the horizontal overlap always runs before the vertical. + * To accomplish that, we run the H on the left and internal vertical + * borders of the currently decoded MB. Then, we wait for the next overlap + * iteration to do H overlap on the right edge of this MB, before moving + * over and running the V overlap on the top and internal horizontal + * borders. Therefore, the H overlap trails by one MB col and the + * V overlap trails by one MB row. This is reflected in the time at which + * we run the put_pixels loop, i.e. delayed by one row and one column. */ +for (i = 0; i < block_count; i++) +if (v->pq >= 9 || v->condover == CONDOVER_ALL || +(v->over_flags_plane[mb_pos] && ((i & 5) == 1 || v->over_flags_plane[mb_pos - 1]))) +vc1_h_overlap_filter(v, s->mb_x ? left_blk : cur_blk, cur_blk, i); + +if (v->fcm != ILACE_FRAME) +for (i = 0; i < block_count; i++) { +if (s->mb_x && (v->pq >= 9 || v->condover == CONDOVER_ALL || +(v->over_flags_plane[mb_pos - 1] && + ((i & 2) || v->over_flags_plane[mb_pos - 1 - s->mb_stride] +vc1_v_overlap_filter(v, s->first_slice_line ? left_blk : topleft_blk, left_blk, i); +if (s->mb_x == s->mb_width - 1) +if (v->pq >= 9 || v->condover == CONDOVER_ALL || +(v->over_flags_plane[mb_pos] && + ((i & 2) || v->over_flags_plane[mb_pos - s->mb_stride]))) +vc1_v_overlap_filter(v, s->first_slice_line ? cur_blk : top_blk, cur_blk, i); +} +} + +void ff_vc1_p_overlap_filter(VC1Context *v) +{ +MpegEncContext *s = &v->s; +int16_t (*topleft_blk)[64], (*top_b
[FFmpeg-cvslog] avcodec/vc1: change to using v->block instead of s->block for P frames
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 20:58:41 2018 +0200| [20de893b3bb46f91f5e88c8d201ef484ae739bce] | committer: Paul B Mahol avcodec/vc1: change to using v->block instead of s->block for P frames The new overlap smooting filter smoothes image pixels stored in v->block. Switch to v->block instead of s->block for storing decoded image pixels for P frames. Additionally, we must take incrementing *_blk_idx out of the vc1_put_signed_blocks_clamped function. Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=20de893b3bb46f91f5e88c8d201ef484ae739bce --- libavcodec/vc1_block.c | 55 -- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index b06ee9fce7..71ccc96b64 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -136,6 +136,7 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) } } } +} #define inc_blk_idx(idx) do { \ idx++; \ @@ -143,12 +144,6 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) idx = 0; \ } while (0) -inc_blk_idx(v->topleft_blk_idx); -inc_blk_idx(v->top_blk_idx); -inc_blk_idx(v->left_blk_idx); -inc_blk_idx(v->cur_blk_idx); -} - /***/ /** * @name VC-1 Block-level functions @@ -1325,15 +1320,15 @@ static int vc1_decode_p_mb(VC1Context *v) if (i == 1 || i == 3 || s->mb_x) v->c_avail = v->mb_type[0][s->block_index[i] - 1]; -vc1_decode_intra_block(v, s->block[i], i, val, mquant, +vc1_decode_intra_block(v, v->block[v->cur_blk_idx][i], i, val, mquant, (i & 4) ? v->codingset2 : v->codingset); if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) continue; -v->vc1dsp.vc1_inv_trans_8x8(s->block[i]); +v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]); if (v->rangeredfrm) for (j = 0; j < 64; j++) -s->block[i][j] <<= 1; -s->idsp.put_signed_pixels_clamped(s->block[i], +v->block[v->cur_blk_idx][i][j] <<= 1; + s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize); @@ -1346,7 +1341,7 @@ static int vc1_decode_p_mb(VC1Context *v) block_cbp |= 0xF << (i << 2); block_intra |= 1 << i; } else if (val) { -pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, +pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize, CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt); block_cbp |= pat << (i << 2); @@ -1436,15 +1431,15 @@ static int vc1_decode_p_mb(VC1Context *v) if (i == 1 || i == 3 || s->mb_x) v->c_avail = v->mb_type[0][s->block_index[i] - 1]; -vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, +vc1_decode_intra_block(v, v->block[v->cur_blk_idx][i], i, is_coded[i], mquant, (i & 4) ? v->codingset2 : v->codingset); if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) continue; -v->vc1dsp.vc1_inv_trans_8x8(s->block[i]); +v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]); if (v->rangeredfrm) for (j = 0; j < 64; j++) -s->block[i][j] <<= 1; -s->idsp.put_signed_pixels_clamped(s->block[i], +v->block[v->cur_blk_idx][i][j] <<= 1; + s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize); @@ -1457,7 +1452,7 @@ static int vc1_decode_p_mb(VC1Context *v) block_cbp |= 0xF << (i << 2); block_intra |= 1 << i; } else if (is_coded[i])
[FFmpeg-cvslog] avcodec/vc1: correct ff_vc1_mbmode_intfrp
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 20:59:20 2018 +0200| [dd1e717f5b799ebf9c813647fbce9da18a91a196] | committer: Paul B Mahol avcodec/vc1: correct ff_vc1_mbmode_intfrp According to VC-1 spec 10.7.3.4, FIELDTX shall be set to the same type as the motion vector for zero-coded blocks. Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=dd1e717f5b799ebf9c813647fbce9da18a91a196 --- libavcodec/vc1data.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libavcodec/vc1data.c b/libavcodec/vc1data.c index fc9ba6da13..0df7d4d666 100644 --- a/libavcodec/vc1data.c +++ b/libavcodec/vc1data.c @@ -61,7 +61,7 @@ const uint8_t ff_vc1_mbmode_intfrp[2][15][4] = { { MV_PMODE_INTFR_1MV , 1, 0, 1 }, { MV_PMODE_INTFR_2MV_FIELD, 0, 0, 1 }, { MV_PMODE_INTFR_2MV_FIELD, 1, 0, 1 }, -{ MV_PMODE_INTFR_2MV_FIELD, 0, 0, 0 }, +{ MV_PMODE_INTFR_2MV_FIELD, 1, 0, 0 }, { MV_PMODE_INTFR_INTRA, 0, 0, 0 } }, { @@ -73,13 +73,13 @@ const uint8_t ff_vc1_mbmode_intfrp[2][15][4] = { { MV_PMODE_INTFR_1MV , 1, 0, 1 }, { MV_PMODE_INTFR_2MV_FIELD, 0, 0, 1 }, { MV_PMODE_INTFR_2MV_FIELD, 1, 0, 1 }, -{ MV_PMODE_INTFR_2MV_FIELD, 0, 0, 0 }, +{ MV_PMODE_INTFR_2MV_FIELD, 1, 0, 0 }, { MV_PMODE_INTFR_4MV , 0, 0, 1 }, { MV_PMODE_INTFR_4MV , 1, 0, 1 }, { MV_PMODE_INTFR_4MV , 0, 0, 0 }, { MV_PMODE_INTFR_4MV_FIELD, 0, 0, 1 }, { MV_PMODE_INTFR_4MV_FIELD, 1, 0, 1 }, -{ MV_PMODE_INTFR_4MV_FIELD, 0, 0, 0 }, +{ MV_PMODE_INTFR_4MV_FIELD, 1, 0, 0 }, { MV_PMODE_INTFR_INTRA, 0, 0, 0 } } }; ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/vc1: correct ff_vc1_dqscale
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 20:59:28 2018 +0200| [b43f1c5225729656792bfce313a12dd4ec3b3fdc] | committer: Paul B Mahol avcodec/vc1: correct ff_vc1_dqscale According to VC-1 spec table 74, the last value in ff_vc1_dqscale should be 0x1041 instead of 0x1000. Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b43f1c5225729656792bfce313a12dd4ec3b3fdc --- libavcodec/vc1data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/vc1data.c b/libavcodec/vc1data.c index 0df7d4d666..19f1cad45f 100644 --- a/libavcodec/vc1data.c +++ b/libavcodec/vc1data.c @@ -1090,7 +1090,7 @@ const int32_t ff_vc1_dqscale[63] = { 0x1F08, 0x1E1E, 0x1D42, 0x1C72, 0x1BAD, 0x1AF3, 0x1A42, 0x199A, 0x18FA, 0x1862, 0x17D0, 0x1746, 0x16C1, 0x1643, 0x15CA, 0x1555, 0x14E6, 0x147B, 0x1414, 0x13B1, 0x1352, 0x12F7, 0x129E, 0x1249, - 0x11F7, 0x11A8, 0x115B, 0x, 0x10C9, 0x1084, 0x1000 + 0x11F7, 0x11A8, 0x115B, 0x, 0x10C9, 0x1084, 0x1041 }; /* P Interlaced field picture MV predictor scaling values (Table 114) */ ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/vc1: implement interlaced out-of-bounds reference pixel replication
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 20:59:41 2018 +0200| [362ce2db4bbc27bb74a82341558eaffb35d8397e] | committer: Paul B Mahol avcodec/vc1: implement interlaced out-of-bounds reference pixel replication The existing implementation did out-of-bounds reference pixel replication for progressive reference frames. In interlaced reference frames both the even and odd line on the horizontal edges need to be replicated. Fixes #3262. Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=362ce2db4bbc27bb74a82341558eaffb35d8397e --- libavcodec/vc1_mc.c | 376 +--- tests/ref/fate/vc1_ilaced_twomv | 18 +- 2 files changed, 318 insertions(+), 76 deletions(-) diff --git a/libavcodec/vc1_mc.c b/libavcodec/vc1_mc.c index 5eacaaa8ee..04b359204c 100644 --- a/libavcodec/vc1_mc.c +++ b/libavcodec/vc1_mc.c @@ -254,9 +254,14 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8); } else { src_x = av_clip( src_x, -17, s->avctx->coded_width); -src_y = av_clip( src_y, -18, s->avctx->coded_height + 1); uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1); -uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1); +if (v->fcm == ILACE_FRAME) { +src_y = av_clip(src_y, -18 + (src_y & 1), s->avctx->coded_height + (src_y & 1)); +uvsrc_y = av_clip(uvsrc_y, -8 + (uvsrc_y & 1), (s->avctx->coded_height >> 1) + (uvsrc_y & 1)); +} else { +src_y = av_clip(src_y, -18, s->avctx->coded_height + 1); +uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1); +} } srcY += src_y * s->linesize + src_x; @@ -284,22 +289,113 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) const int k = 17 + s->mspel * 2; srcY -= s->mspel * (1 + s->linesize); -s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, srcY, - s->linesize, s->linesize, - k, k, - src_x - s->mspel, src_y - s->mspel, - s->h_edge_pos, v_edge_pos); +if (v->fcm == ILACE_FRAME) { +if (src_y - s->mspel & 1) { +s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, + srcY, + 2 * s->linesize, + 2 * s->linesize, + k, + k + 1 >> 1, + src_x - s->mspel, + src_y - s->mspel >> 1, + s->h_edge_pos, + v_edge_pos + 1 >> 1); +s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + s->linesize, + srcY + s->linesize, + 2 * s->linesize, + 2 * s->linesize, + k, + k >> 1, + src_x - s->mspel, + src_y - s->mspel + 1 >> 1, + s->h_edge_pos, + v_edge_pos >> 1); +} else { +s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, + srcY, + 2 * s->linesize, + 2 * s->linesize, + k, + k + 1 >> 1, + src_x - s->mspel, + src_y - s->mspel >> 1, + s->h_edge_pos, + v_edge_pos >> 1); +s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + s->linesize, + srcY + s->linesize, + 2 * s->linesize, + 2 * s->linesize, + k, + k >> 1, + src_x - s->mspel, + src_y - s->mspel + 1 >> 1, + s->h_edge_pos, + v_edge_pos + 1 >> 1); +} +} else +s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, srcY, + s->linesize, s->linesize, + k, k, + src_x - s->mspel, src_y - s->mspel, +
[FFmpeg-cvslog] avcodec/vc1: remove unused overlap smooting and loop filter
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 21:00:02 2018 +0200| [7a70879624a0981874df760356775eda871446a5] | committer: Paul B Mahol avcodec/vc1: remove unused overlap smooting and loop filter remove unused overlap smooting and loop filter Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7a70879624a0981874df760356775eda871446a5 --- libavcodec/vc1.h| 3 - libavcodec/vc1_loopfilter.c | 297 2 files changed, 300 deletions(-) diff --git a/libavcodec/vc1.h b/libavcodec/vc1.h index 0dfdef78cd..1d283f8589 100644 --- a/libavcodec/vc1.h +++ b/libavcodec/vc1.h @@ -423,11 +423,8 @@ int ff_vc1_decode_end(AVCodecContext *avctx); void ff_vc1_decode_blocks(VC1Context *v); void ff_vc1_loop_filter_iblk(VC1Context *v, int pq); -void ff_vc1_loop_filter_iblk_delayed(VC1Context *v, int pq); -void ff_vc1_smooth_overlap_filter_iblk(VC1Context *v); void ff_vc1_i_overlap_filter(VC1Context *v); void ff_vc1_p_overlap_filter(VC1Context *v); -void ff_vc1_apply_p_loop_filter(VC1Context *v); void ff_vc1_i_loop_filter(VC1Context *v); void ff_vc1_p_loop_filter(VC1Context *v); void ff_vc1_p_intfr_loop_filter(VC1Context *v); diff --git a/libavcodec/vc1_loopfilter.c b/libavcodec/vc1_loopfilter.c index 7ef0fd1ea2..bab28a649f 100644 --- a/libavcodec/vc1_loopfilter.c +++ b/libavcodec/vc1_loopfilter.c @@ -61,153 +61,6 @@ void ff_vc1_loop_filter_iblk(VC1Context *v, int pq) } } -void ff_vc1_loop_filter_iblk_delayed(VC1Context *v, int pq) -{ -MpegEncContext *s = &v->s; -int j; - -/* The loopfilter runs 1 row and 1 column behind the overlap filter, which - * means it runs two rows/cols behind the decoding loop. */ -if (!s->first_slice_line) { -if (s->mb_x) { -if (s->mb_y >= s->start_mb_y + 2) { -v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq); - -if (s->mb_x >= 2) -v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 16, s->linesize, pq); -v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 8, s->linesize, pq); -if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) -for (j = 0; j < 2; j++) { -v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq); -if (s->mb_x >= 2) { -v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 16 * s->uvlinesize - 8, s->uvlinesize, pq); -} -} -} -v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize - 16, s->linesize, pq); -} - -if (s->mb_x == s->mb_width - 1) { -if (s->mb_y >= s->start_mb_y + 2) { -v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq); - -if (s->mb_x) -v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize, s->linesize, pq); -v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize + 8, s->linesize, pq); -if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) -for (j = 0; j < 2; j++) { -v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq); -if (s->mb_x >= 2) { -v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 16 * s->uvlinesize, s->uvlinesize, pq); -} -} -} -v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize, s->linesize, pq); -} - -if (s->mb_y == s->end_mb_y) { -if (s->mb_x) { -if (s->mb_x >= 2) -v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq); -v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 8, s->linesize, pq); -if (s->mb_x >= 2 && (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY))) { -for (j = 0; j < 2; j++) { -v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq); -} -} -} - -if (s->mb_x == s->mb_width - 1) { -if (s->mb_x) -v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq); -v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize + 8, s->linesize, pq); -if (s->mb_x && (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY))) { -for (j = 0; j < 2; j++) { -v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq); -} -} -} -} -} -} - -void ff_vc1_smooth_overlap_f
[FFmpeg-cvslog] avcodec/vc1: store color-difference reference field type
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 20:59:13 2018 +0200| [79f8074cc4055e96d55752554afeee4db9d4e0c8] | committer: Paul B Mahol avcodec/vc1: store color-difference reference field type The loop filter for P interlace field pictures needs the reference field type. For luma, the reference field type was already available. Store the reference field type for color-difference as well. Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=79f8074cc4055e96d55752554afeee4db9d4e0c8 --- libavcodec/vc1_mc.c | 8 1 file changed, 8 insertions(+) diff --git a/libavcodec/vc1_mc.c b/libavcodec/vc1_mc.c index 75c74cad8d..5eacaaa8ee 100644 --- a/libavcodec/vc1_mc.c +++ b/libavcodec/vc1_mc.c @@ -344,6 +344,10 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); } +if (v->field_mode) { +v->mv_f[dir][s->block_index[4] + v->mb_off] = v->cur_field_type != v->ref_field_type[dir]; +v->mv_f[dir][s->block_index[5] + v->mb_off] = v->cur_field_type != v->ref_field_type[dir]; +} } /** Do motion compensation for 4-MV macroblock - luminance block @@ -636,6 +640,10 @@ void ff_vc1_mc_4mv_chroma(VC1Context *v, int dir) v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); } +if (v->field_mode) { +v->mv_f[dir][s->block_index[4] + v->mb_off] = v->cur_field_type != chroma_ref_type; +v->mv_f[dir][s->block_index[5] + v->mb_off] = v->cur_field_type != chroma_ref_type; +} } /** Do motion compensation for 4-MV interlaced frame chroma macroblock (both U and V) ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/vc1: store additional bitstream elements during MB decoding
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 20:58:59 2018 +0200| [c5f74b1e232cd621e540caac9aa70e12021db95f] | committer: Paul B Mahol avcodec/vc1: store additional bitstream elements during MB decoding The new loop filter needs additional MB properties to make its filtering decisions. Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c5f74b1e232cd621e540caac9aa70e12021db95f --- libavcodec/vc1_block.c | 58 +- libavcodec/vc1dec.c| 16 +++--- 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index 71ccc96b64..2aae6b5ec1 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -1595,6 +1595,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) s->dest[dst_idx] + off, stride_y); //TODO: loop filter +block_cbp |= 0xf << (i << 2); } } else { // inter MB @@ -1690,9 +1691,11 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) v->blk_mv_type[s->block_index[3]] = 0; ff_vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0); ff_vc1_mc_1mv(v, 0); +v->fieldtx_plane[mb_pos] = 0; } -if (s->mb_x == s->mb_width - 1) -memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0])*s->mb_stride); +v->cbp[s->mb_x] = block_cbp; +v->ttblk[s->mb_x]= block_tt; + return 0; } @@ -1756,6 +1759,7 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) (i & 4) ? s->uvlinesize : s->linesize); // TODO: loop filter +block_cbp |= 0xf << (i << 2); } } else { s->mb_intra = v->is_intra[s->mb_x] = 0; @@ -1810,8 +1814,9 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) } } } -if (s->mb_x == s->mb_width - 1) -memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0]) * s->mb_stride); +v->cbp[s->mb_x] = block_cbp; +v->ttblk[s->mb_x]= block_tt; + return 0; } @@ -1988,6 +1993,7 @@ static void vc1_decode_b_mb_intfi(VC1Context *v) int fwd; int dmv_x[2], dmv_y[2], pred_flag[2]; int bmvtype = BMV_TYPE_BACKWARD; +int block_cbp = 0, pat, block_tt = 0; int idx_mbmode; mquant = v->pq; /* Lossy initialization */ @@ -2118,16 +2124,19 @@ static void vc1_decode_b_mb_intfi(VC1Context *v) val = ((cbp >> (5 - i)) & 1); off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize; if (val) { -vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, - first_block, s->dest[dst_idx] + off, - (i & 4) ? s->uvlinesize : s->linesize, - CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), NULL); +pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, + first_block, s->dest[dst_idx] + off, + (i & 4) ? s->uvlinesize : s->linesize, + CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt); +block_cbp |= pat << (i << 2); if (!v->ttmbf && ttmb < 8) ttmb = -1; first_block = 0; } } } +v->cbp[s->mb_x] = block_cbp; +v->ttblk[s->mb_x]= block_tt; } /** Decode one B-frame MB (in interlaced frame B picture) @@ -2468,12 +2477,12 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) if (direct || bmvtype == BMV_TYPE_INTERPOLATED) { ff_vc1_interp_mc(v); } +v->fieldtx_plane[mb_pos] = 0; } } -if (s->mb_x == s->mb_width - 1) -memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0]) * s->mb_stride); v->cbp[s->mb_x] = block_cbp; v->ttblk[s->mb_x]= block_tt; + return 0; } @@ -2703,6 +2712,8 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) s->c_dc_scale = s->c_dc_scale_table[mquant]; for (k = 0; k < 6; k++) { +v->mb_type[0][s->block_index[k]] = 1; + val = ((cbp >> (5 - k)) & 1); if (k < 4) { @@ -2799,7 +2810,7 @@ static void vc1_decode_p_blocks(VC1Context *v) apply_loop_filter = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY) && v->fcm == PROGRESSIVE; s->first_slice_line = 1; -memset(v->cbp_base, 0, sizeof(v->cbp_base[0])*2*s->mb_stride); +memset(v->cbp_base, 0, sizeof(v->cbp_base[0]) * 3 * s->mb_
[FFmpeg-cvslog] avcodec/vc1: re-implement vc1_put_signed_blocks_clamped
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 20:59:49 2018 +0200| [e60e14ef929fd1b905803532a476bab08ef0030b] | committer: Paul B Mahol avcodec/vc1: re-implement vc1_put_signed_blocks_clamped The existing implementation only used vc1_put_signed_blocks_clamped for I and BI frames. This rewritten version is also applicable to P frame both progressive and frame/field-interlace. Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e60e14ef929fd1b905803532a476bab08ef0030b --- libavcodec/vc1_block.c | 116 - 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index 2aae6b5ec1..5adaba072b 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -69,70 +69,70 @@ static inline void init_block_index(VC1Context *v) static void vc1_put_signed_blocks_clamped(VC1Context *v) { MpegEncContext *s = &v->s; -int topleft_mb_pos, top_mb_pos; -int stride_y, fieldtx = 0; -int v_dist; - -/* The put pixels loop is always one MB row behind the decoding loop, - * because we can only put pixels when overlap filtering is done, and - * for filtering of the bottom edge of a MB, we need the next MB row - * present as well. - * Within the row, the put pixels loop is also one MB col behind the - * decoding loop. The reason for this is again, because for filtering - * of the right MB edge, we need the next MB present. */ -if (!s->first_slice_line) { +uint8_t *dest; +int block_count = CONFIG_GRAY && (s->avctx->flags & AV_CODEC_FLAG_GRAY) ? 4 : 6; +int fieldtx = 0; +int i; + +/* The put pixels loop is one MB row and one MB column behind the decoding + * loop because we can only put pixels when overlap filtering is done. For + * interlaced frame pictures, however, the put pixels loop is only one + * column behind the decoding loop as interlaced frame pictures only need + * horizontal overlap filtering. */ +if (!s->first_slice_line && v->fcm != ILACE_FRAME) { +if (s->mb_x) { +for (i = 0; i < block_count; i++) { +if (i > 3 ? v->mb_type[0][s->block_index[i] - s->block_wrap[i] - 1] : +v->mb_type[0][s->block_index[i] - 2 * s->block_wrap[i] - 2]) { +dest = s->dest[0] + ((i & 2) - 4) * 4 * s->linesize + ((i & 1) - 2) * 8; + s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][i], + i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest, + i > 3 ? s->uvlinesize : s->linesize); +} +} +} +if (s->mb_x == s->mb_width - 1) { +for (i = 0; i < block_count; i++) { +if (i > 3 ? v->mb_type[0][s->block_index[i] - s->block_wrap[i]] : +v->mb_type[0][s->block_index[i] - 2 * s->block_wrap[i]]) { +dest = s->dest[0] + ((i & 2) - 4) * 4 * s->linesize + (i & 1) * 8; + s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][i], + i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, + i > 3 ? s->uvlinesize : s->linesize); +} +} +} +} +if (s->mb_y == s->end_mb_y - 1 || v->fcm == ILACE_FRAME) { if (s->mb_x) { -topleft_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x - 1; if (v->fcm == ILACE_FRAME) -fieldtx = v->fieldtx_plane[topleft_mb_pos]; -stride_y = s->linesize << fieldtx; -v_dist = (16 - fieldtx) >> (fieldtx == 0); -s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0], - s->dest[0] - 16 * s->linesize - 16, - stride_y); -s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][1], - s->dest[0] - 16 * s->linesize - 8, - stride_y); -s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][2], - s->dest[0] - v_dist * s->linesize - 16, - stride_y); -s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][3], - s->dest[0] - v_dist * s->linesize - 8, - stride_y); -if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { -s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][4], - s->dest[1] - 8 * s->
[FFmpeg-cvslog] avcodec/vc1: more corrections for AC inverse quantization scaling
ffmpeg | branch: master | Jerome Borsboom | Wed Apr 25 20:07:53 2018 +0200| [144ce364cd2df752226115c243d92083291c9355] | committer: Paul B Mahol avcodec/vc1: more corrections for AC inverse quantization scaling HALFQP should only be added to the inverse quantizer when the block is coded with PQUANT. When PQUANT is equal to ALTPQUANT, the original test for the addition of HALFQP fails. A negative value for mquant indicates that the value was derived from VOPDQUANT. Fixes #4372 Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=144ce364cd2df752226115c243d92083291c9355 --- libavcodec/vc1.c | 1 + libavcodec/vc1_block.c | 129 ++--- 2 files changed, 69 insertions(+), 61 deletions(-) diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index 5fc479347e..b7050440d5 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -991,6 +991,7 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) v->pquantizer = 1; break; } +v->dquantfrm = 0; if (v->postprocflag) v->postproc = get_bits(gb, 2); diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index de06b6fb2a..7cabe49eda 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -160,13 +160,13 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) int edges = 0; \ if (v->dqprofile == DQPROFILE_ALL_MBS) { \ if (v->dqbilevel) {\ -mquant = (get_bits1(gb)) ? v->altpq : v->pq; \ +mquant = (get_bits1(gb)) ? -v->altpq : v->pq; \ } else { \ mqdiff = get_bits(gb, 3); \ if (mqdiff != 7) \ -mquant = v->pq + mqdiff; \ +mquant = -v->pq - mqdiff; \ else \ -mquant = get_bits(gb, 5); \ +mquant = -get_bits(gb, 5); \ } \ } \ if (v->dqprofile == DQPROFILE_SINGLE_EDGE) \ @@ -176,13 +176,13 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) else if (v->dqprofile == DQPROFILE_FOUR_EDGES) \ edges = 15;\ if ((edges&1) && !s->mb_x) \ -mquant = v->altpq; \ +mquant = -v->altpq;\ if ((edges&2) && s->first_slice_line) \ -mquant = v->altpq; \ +mquant = -v->altpq;\ if ((edges&4) && s->mb_x == (s->mb_width - 1)) \ -mquant = v->altpq; \ +mquant = -v->altpq;\ if ((edges&8) && s->mb_y == (s->mb_height - 1))\ -mquant = v->altpq; \ +mquant = -v->altpq;\ if (!mquant || mquant > 31) { \ av_log(v->s.avctx, AV_LOG_ERROR, \ "Overriding invalid mquant %d\n", mquant); \ @@ -388,7 +388,7 @@ static inline int ff_vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n, int dqscale_index; /* scale predictors if needed */ -q1 = s->current_picture.qscale_table[mb_pos]; +q1 = FFABS(s->current_picture.qscale_table[mb_pos]); dqscale_index = s->y_dc_scale_table[q1] - 1; if (dqscale_index < 0) return 0; @@ -404,12 +404,12 @@ static inline int ff_vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n, a = dc_val[ - wrap]; if (c_avail && (n != 1 && n != 3)) { -q2 = s->current_picture.qscale_table[mb_pos - 1]; +q2 = FFABS(s->current_picture.qscale_table[mb_pos - 1]); if (q2 && q2 != q1) c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x2) >> 18; } if (a_avail && (n != 2 && n != 3)) { -q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; +q2 = FFABS(s->current_picture.qscale_table[mb_pos - s->mb_stride]); if (q2 && q2 != q1) a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x2) >> 18; } @@ -419,7 +419,7 @@ static inline int ff_vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n, off--; if (n != 2) off -= s->mb_stride; -q2 = s->current_picture.qscale_table[off]; +
[FFmpeg-cvslog] avcodec/vc1: correct forgotten v->blocks_off
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 21:00:33 2018 +0200| [9ae2845b1c0a358f8585634f443283d560715580] | committer: Paul B Mahol avcodec/vc1: correct forgotten v->blocks_off correct forgotten v->blocks_off Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9ae2845b1c0a358f8585634f443283d560715580 --- libavcodec/vc1_pred.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/vc1_pred.c b/libavcodec/vc1_pred.c index 3a52a22bc6..de736ec775 100644 --- a/libavcodec/vc1_pred.c +++ b/libavcodec/vc1_pred.c @@ -254,7 +254,7 @@ void ff_vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y, v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0; s->current_picture.motion_val[1][xy + 1 + v->blocks_off][0] = 0; s->current_picture.motion_val[1][xy + 1 + v->blocks_off][1] = 0; -s->current_picture.motion_val[1][xy + wrap][0] = 0; +s->current_picture.motion_val[1][xy + wrap + v->blocks_off][0] = 0; s->current_picture.motion_val[1][xy + wrap + v->blocks_off][1] = 0; s->current_picture.motion_val[1][xy + wrap + 1 + v->blocks_off][0] = 0; s->current_picture.motion_val[1][xy + wrap + 1 + v->blocks_off][1] = 0; ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/vc1: correct mspel for field-interlace B frames
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 21:00:08 2018 +0200| [a1dc0bdaf49497358d70002ffb5ec498f5f41270] | committer: Paul B Mahol avcodec/vc1: correct mspel for field-interlace B frames mspel indicates the use of bicubic interpolation. The check wrongly included MVMODE MV_PMODE_1MV_HPEL as using bilinear interpolation. Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=a1dc0bdaf49497358d70002ffb5ec498f5f41270 --- libavcodec/vc1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index bf4024cb5a..5fc479347e 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -1226,7 +1226,7 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) v->mv_mode = ff_vc1_mv_pmode_table2[lowquant][mvmode]; v->qs_last = v->s.quarter_sample; v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV || v->mv_mode == MV_PMODE_MIXED_MV); -v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || v->mv_mode == MV_PMODE_1MV_HPEL); +v->s.mspel = (v->mv_mode != MV_PMODE_1MV_HPEL_BILIN); status = bitplane_decoding(v->forward_mb_plane, &v->fmb_is_raw, v); if (status < 0) return -1; ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/vc1: add overlap smooting and loop filter for frame/field-interlace
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 20:59:55 2018 +0200| [cc5deeb74a345f29f5bf68b4db7452fc3b3b350a] | committer: Paul B Mahol avcodec/vc1: add overlap smooting and loop filter for frame/field-interlace Add previously omitted overlap smooting and loop filtering for frame/field-interlace pictures. For progressive pictures switch to the re-implemented versions of overlap smooting and loop filtering. Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=cc5deeb74a345f29f5bf68b4db7452fc3b3b350a --- libavcodec/vc1_block.c | 111 +++- tests/ref/fate/vc1_ilaced_twomv | 26 +- tests/ref/fate/vc1_sa10143 | 60 +++--- 3 files changed, 83 insertions(+), 114 deletions(-) diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index 5adaba072b..e78e4806bd 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -1328,16 +1328,6 @@ static int vc1_decode_p_mb(VC1Context *v) if (v->rangeredfrm) for (j = 0; j < 64; j++) v->block[v->cur_blk_idx][i][j] <<= 1; - s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i], - s->dest[dst_idx] + off, - i & 4 ? s->uvlinesize -: s->linesize); -if (v->pq >= 9 && v->overlap) { -if (v->c_avail) -v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize); -if (v->a_avail) -v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize); -} block_cbp |= 0xF << (i << 2); block_intra |= 1 << i; } else if (val) { @@ -1439,16 +1429,6 @@ static int vc1_decode_p_mb(VC1Context *v) if (v->rangeredfrm) for (j = 0; j < 64; j++) v->block[v->cur_blk_idx][i][j] <<= 1; - s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i], - s->dest[dst_idx] + off, - (i & 4) ? s->uvlinesize - : s->linesize); -if (v->pq >= 9 && v->overlap) { -if (v->c_avail) -v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize); -if (v->a_avail) -v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize); -} block_cbp |= 0xF << (i << 2); block_intra |= 1 << i; } else if (is_coded[i]) { @@ -1479,6 +1459,10 @@ static int vc1_decode_p_mb(VC1Context *v) } } end: +if (v->overlap && v->pq >= 9) +ff_vc1_p_overlap_filter(v); +vc1_put_signed_blocks_clamped(v); + v->cbp[s->mb_x] = block_cbp; v->ttblk[s->mb_x]= block_tt; v->is_intra[s->mb_x] = block_intra; @@ -1506,7 +1490,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) int skipped, fourmv = 0, twomv = 0; int block_cbp = 0, pat, block_tt = 0; int idx_mbmode = 0, mvbp; -int stride_y, fieldtx; +int fieldtx; mquant = v->pq; /* Lossy initialization */ @@ -1584,17 +1568,10 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) continue; v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]); -if (i < 4) { -stride_y = s->linesize << fieldtx; +if (i < 4) off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize; -} else { -stride_y = s->uvlinesize; +else off = 0; -} -s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i], - s->dest[dst_idx] + off, - stride_y); -//TODO: loop filter block_cbp |= 0xf << (i << 2); } @@ -1693,6 +1670,10 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) ff_vc1_mc_1mv(v, 0); v->fieldtx_plane[mb_pos] = 0; } +if (v->overlap && v->pq >= 9) +ff_vc1_p_overlap_filter(v); +vc1_put_signed_blocks_clamped(v); + v->cbp[s->mb_x] = block_cbp; v->ttblk[s->mb_x]
[FFmpeg-cvslog] avcodec/vc1: re-implement and expand VC-1 loop filtering
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 20:58:52 2018 +0200| [ded52f6e36c59186ad768427c484573d5a8d0bb6] | committer: Paul B Mahol avcodec/vc1: re-implement and expand VC-1 loop filtering The existing implementation did loop filtering for progressive frames only. This rewritten version implements loop filtering for all applicable frame types for both progessive and frame/field-interlace. Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ded52f6e36c59186ad768427c484573d5a8d0bb6 --- libavcodec/vc1.h|4 + libavcodec/vc1_loopfilter.c | 1042 +++ 2 files changed, 1046 insertions(+) diff --git a/libavcodec/vc1.h b/libavcodec/vc1.h index 85504c2f9f..0dfdef78cd 100644 --- a/libavcodec/vc1.h +++ b/libavcodec/vc1.h @@ -428,6 +428,10 @@ void ff_vc1_smooth_overlap_filter_iblk(VC1Context *v); void ff_vc1_i_overlap_filter(VC1Context *v); void ff_vc1_p_overlap_filter(VC1Context *v); void ff_vc1_apply_p_loop_filter(VC1Context *v); +void ff_vc1_i_loop_filter(VC1Context *v); +void ff_vc1_p_loop_filter(VC1Context *v); +void ff_vc1_p_intfr_loop_filter(VC1Context *v); +void ff_vc1_b_intfi_loop_filter(VC1Context *v); void ff_vc1_mc_1mv(VC1Context *v, int dir); void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg); diff --git a/libavcodec/vc1_loopfilter.c b/libavcodec/vc1_loopfilter.c index 3122b1a258..7ef0fd1ea2 100644 --- a/libavcodec/vc1_loopfilter.c +++ b/libavcodec/vc1_loopfilter.c @@ -451,3 +451,1045 @@ void ff_vc1_apply_p_loop_filter(VC1Context *v) } } } + +#define LEFT_EDGE (1 << 0) +#define RIGHT_EDGE (1 << 1) +#define TOP_EDGE(1 << 2) +#define BOTTOM_EDGE (1 << 3) + +static av_always_inline void vc1_i_h_loop_filter(VC1Context *v, uint8_t *dest, + uint32_t flags, int block_num) +{ +MpegEncContext *s = &v->s; +int pq = v->pq; +uint8_t *dst; + +if (block_num & 2) +return; + +if (!(flags & LEFT_EDGE) || (block_num & 5) == 1) { +if (block_num > 3) +dst = dest; +else +dst = dest + (block_num & 2) * 4 * s->linesize + (block_num & 1) * 8; + +if (v->fcm == ILACE_FRAME) +if (block_num > 3) { +v->vc1dsp.vc1_h_loop_filter4(dst, 2 * s->uvlinesize, pq); +v->vc1dsp.vc1_h_loop_filter4(dst + s->uvlinesize, 2 * s->uvlinesize, pq); +} else { +v->vc1dsp.vc1_h_loop_filter8(dst, 2 * s->linesize, pq); +v->vc1dsp.vc1_h_loop_filter8(dst + s->linesize, 2 * s->linesize, pq); +} +else +if (block_num > 3) +v->vc1dsp.vc1_h_loop_filter8(dst, s->uvlinesize, pq); +else +v->vc1dsp.vc1_h_loop_filter16(dst, s->linesize, pq); +} +} + +static av_always_inline void vc1_i_v_loop_filter(VC1Context *v, uint8_t *dest, + uint32_t flags, uint8_t fieldtx, + int block_num) +{ +MpegEncContext *s = &v->s; +int pq = v->pq; +uint8_t *dst; + +if ((block_num & 5) == 1) +return; + +if (!(flags & TOP_EDGE) || block_num & 2) { +if (block_num > 3) +dst = dest; +else +dst = dest + (block_num & 2) * 4 * s->linesize + (block_num & 1) * 8; + +if (v->fcm == ILACE_FRAME) { +if (block_num > 3) { +v->vc1dsp.vc1_v_loop_filter8(dst, 2 * s->uvlinesize, pq); +v->vc1dsp.vc1_v_loop_filter8(dst + s->uvlinesize, 2 * s->uvlinesize, pq); +} else if (block_num < 2 || !fieldtx) { +v->vc1dsp.vc1_v_loop_filter16(dst, 2 * s->linesize, pq); +v->vc1dsp.vc1_v_loop_filter16(dst + s->linesize, 2 * s->linesize, pq); +} +} else +if (block_num > 3) +v->vc1dsp.vc1_v_loop_filter8(dst, s->uvlinesize, pq); +else +v->vc1dsp.vc1_v_loop_filter16(dst, s->linesize, pq); +} +} + +void ff_vc1_i_loop_filter(VC1Context *v) +{ +MpegEncContext *s = &v->s; +int block_count = CONFIG_GRAY && (s->avctx->flags & AV_CODEC_FLAG_GRAY) ? 4 : 6; +int mb_pos = s->mb_x + s->mb_y * s->mb_stride; +uint8_t *dest, fieldtx; +uint32_t flags = 0; +int i; + +/* Within a MB, the vertical loop filter always runs before the horizontal. + * To accomplish that, we run the V loop filter on top and internal + * horizontal borders of the last overlap filtered MB. Then, we wait for + * the loop filter iteration on the next row to do V loop filter on the + * bottom edge of this MB, before moving over and running the H loop + * filter on the left and internal vertical borders. Therefore, the loop + * filter trails by one row and one column relative to the overlap filter + * and two rows and two colums relati
[FFmpeg-cvslog] avcodec/vc1: correct AC inverse quantization scaling
ffmpeg | branch: master | Jerome Borsboom | Mon Apr 23 21:00:15 2018 +0200| [797c1536a46e645304a9325bd58f99420c37e773] | committer: Paul B Mahol avcodec/vc1: correct AC inverse quantization scaling HALFQP should only be added to the inverse quantizer when the block is coded with PQUANT. See 8.1.3.8 in VC-1 spec. Signed-off-by: Jerome Borsboom > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=797c1536a46e645304a9325bd58f99420c37e773 --- libavcodec/vc1_block.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index e78e4806bd..de06b6fb2a 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -944,7 +944,7 @@ static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, ac_val = s->ac_val[0][s->block_index[n]]; ac_val2 = ac_val; -scale = mquant * 2 + v->halfpq; +scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0); if (dc_pred_dir) //left ac_val -= 16; ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/error_resilience: Fix integer overflow in filter181()
ffmpeg | branch: master | Michael Niedermayer | Sun Apr 22 21:46:05 2018 +0200| [1c97035e3b1677d6f0c5b6161ebfeffcf7bb638d] | committer: Michael Niedermayer avcodec/error_resilience: Fix integer overflow in filter181() Fixes: runtime error: signed integer overflow: 197710 * 10923 cannot be represented in type 'int' Fixes: 7010/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_MPEG4_fuzzer-5667127596941312 Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=1c97035e3b1677d6f0c5b6161ebfeffcf7bb638d --- libavcodec/error_resilience.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c index 25e54a535b..339042e206 100644 --- a/libavcodec/error_resilience.c +++ b/libavcodec/error_resilience.c @@ -107,7 +107,7 @@ static void filter181(int16_t *data, int width, int height, ptrdiff_t stride) dc = -prev_dc + data[x + y * stride] * 8 - data[x + 1 + y * stride]; -dc = (dc * 10923 + 32768) >> 16; +dc = (av_clip(dc, INT_MIN/10923, INT_MAX/10923 - 32768) * 10923 + 32768) >> 16; prev_dc = data[x + y * stride]; data[x + y * stride] = dc; } @@ -123,7 +123,7 @@ static void filter181(int16_t *data, int width, int height, ptrdiff_t stride) dc = -prev_dc + data[x + y * stride] * 8 - data[x + (y + 1) * stride]; -dc = (dc * 10923 + 32768) >> 16; +dc = (av_clip(dc, INT_MIN/10923, INT_MAX/10923 - 32768) * 10923 + 32768) >> 16; prev_dc = data[x + y * stride]; data[x + y * stride] = dc; } ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/h263dec: Check slice_ret in mspeg4 slice loop
ffmpeg | branch: master | Michael Niedermayer | Sun Apr 22 21:07:45 2018 +0200| [de841fbea7655b74a9663001e01008a86c88779a] | committer: Michael Niedermayer avcodec/h263dec: Check slice_ret in mspeg4 slice loop Fixes infinite loop Fixes: 6858/clusterfuzz-testcase-ffmpeg_AV_CODEC_ID_MSMPEG4V3_fuzzer-4681563766784000 Fixes: 6890/clusterfuzz-testcase-ffmpeg_AV_CODEC_ID_WMV1_fuzzer-4756103142309888 Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=de841fbea7655b74a9663001e01008a86c88779a --- libavcodec/h263dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index 484bf39578..eae29fa438 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -641,7 +641,7 @@ retry: slice_ret = decode_slice(s); while (s->mb_y < s->mb_height) { if (s->msmpeg4_version) { -if (s->slice_height == 0 || s->mb_x != 0 || +if (s->slice_height == 0 || s->mb_x != 0 || slice_ret < 0 || (s->mb_y % s->slice_height) != 0 || get_bits_left(&s->gb) < 0) break; } else { ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/elsdec: Fix memleaks
ffmpeg | branch: master | Michael Niedermayer | Wed Apr 25 01:54:17 2018 +0200| [0bd0401336df4e4ca7f3da6a7e226904fd7d5add] | committer: Michael Niedermayer avcodec/elsdec: Fix memleaks Fixes: 6798/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_G2M_fuzzer-5135899701542912 Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=0bd0401336df4e4ca7f3da6a7e226904fd7d5add --- libavcodec/elsdec.c | 8 +++- libavcodec/g2meet.c | 1 + 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/libavcodec/elsdec.c b/libavcodec/elsdec.c index 4797965457..cb0e9c6534 100644 --- a/libavcodec/elsdec.c +++ b/libavcodec/elsdec.c @@ -271,7 +271,7 @@ void ff_els_decoder_init(ElsDecCtx *ctx, const uint8_t *in, size_t data_size) void ff_els_decoder_uninit(ElsUnsignedRung *rung) { -av_free(rung->rem_rung_list); +av_freep(&rung->rem_rung_list); } static int els_import_byte(ElsDecCtx *ctx) @@ -391,12 +391,10 @@ unsigned ff_els_decode_unsigned(ElsDecCtx *ctx, ElsUnsignedRung *ur) if (ur->rung_list_size <= (ur->avail_index + 2) * sizeof(ElsRungNode)) { // remember rung_node position ptrdiff_t pos = rung_node - ur->rem_rung_list; -ur->rem_rung_list = av_realloc(ur->rem_rung_list, +ctx->err = av_reallocp(&ur->rem_rung_list, ur->rung_list_size + RUNG_SPACE); -if (!ur->rem_rung_list) { -av_free(ur->rem_rung_list); -ctx->err = AVERROR(ENOMEM); +if (ctx->err < 0) { return 0; } memset((uint8_t *) ur->rem_rung_list + ur->rung_list_size, 0, diff --git a/libavcodec/g2meet.c b/libavcodec/g2meet.c index a46157218f..b409dae813 100644 --- a/libavcodec/g2meet.c +++ b/libavcodec/g2meet.c @@ -927,6 +927,7 @@ static int epic_jb_decode_tile(G2MContext *c, int tile_x, int tile_y, if (c->ec.els_ctx.err != 0) { av_log(avctx, AV_LOG_ERROR, "ePIC: couldn't decode transparency pixel!\n"); +ff_els_decoder_uninit(&c->ec.unsigned_rung); return AVERROR_INVALIDDATA; } ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/h2645_parse: Replace RNXYA by RNXY in ff_h2645_extract_rbsp()
ffmpeg | branch: master | Michael Niedermayer | Sat Mar 10 21:32:51 2018 +0100| [7562567f41aa61860ed5ab03dbb11c1316a34021] | committer: Michael Niedermayer avcodec/h2645_parse: Replace RNXYA by RNXY in ff_h2645_extract_rbsp() Fixes misaligned accesses Found-by: Matt Wolenetz Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7562567f41aa61860ed5ab03dbb11c1316a34021 --- libavcodec/h2645_parse.c | 8 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavcodec/h2645_parse.c b/libavcodec/h2645_parse.c index e6c40381b0..dbf2435677 100644 --- a/libavcodec/h2645_parse.c +++ b/libavcodec/h2645_parse.c @@ -53,8 +53,8 @@ int ff_h2645_extract_rbsp(const uint8_t *src, int length, i++ #if HAVE_FAST_64BIT for (i = 0; i + 1 < length; i += 9) { -if (!((~AV_RN64A(src + i) & - (AV_RN64A(src + i) - 0x0100010001000101ULL)) & +if (!((~AV_RN64(src + i) & + (AV_RN64(src + i) - 0x0100010001000101ULL)) & 0x8000800080008080ULL)) continue; FIND_FIRST_ZERO; @@ -63,8 +63,8 @@ int ff_h2645_extract_rbsp(const uint8_t *src, int length, } #else for (i = 0; i + 1 < length; i += 5) { -if (!((~AV_RN32A(src + i) & - (AV_RN32A(src + i) - 0x01000101U)) & +if (!((~AV_RN32(src + i) & + (AV_RN32(src + i) - 0x01000101U)) & 0x80008080U)) continue; FIND_FIRST_ZERO; ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] fix memory leak of parsing dash MPD
ffmpeg | branch: master | guikunzhi | Thu Apr 26 12:40:52 2018 +0800| [8ea8be595166cdae73bf3f8bee2f28bc94f1c988] | committer: Steven Liu fix memory leak of parsing dash MPD Signed-off-by: guikunzhi > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8ea8be595166cdae73bf3f8bee2f28bc94f1c988 --- libavformat/dashdec.c | 14 +++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c index a2e2e13382..c90bc51ce3 100644 --- a/libavformat/dashdec.c +++ b/libavformat/dashdec.c @@ -706,6 +706,7 @@ static int resolve_content_path(AVFormatContext *s, const char *url, int *max_ur char *baseurl = NULL; char *root_url = NULL; char *text = NULL; +char *tmp = NULL; int isRootHttp = 0; char token ='/'; @@ -735,9 +736,11 @@ static int resolve_content_path(AVFormatContext *s, const char *url, int *max_ur goto end; } av_strlcpy(text, url, strlen(url)+1); -while (mpdName = av_strtok(text, "/", &text)) { +tmp = text; +while (mpdName = av_strtok(tmp, "/", &tmp)) { size = strlen(mpdName); } +av_free(text); path = av_mallocz(tmp_max_url_size); tmp_str = av_mallocz(tmp_max_url_size); @@ -796,6 +799,7 @@ end: } av_free(path); av_free(tmp_str); +xmlFree(baseurl); return updated; } @@ -1121,6 +1125,7 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in) xmlNodePtr root_element = NULL; xmlNodePtr node = NULL; xmlNodePtr period_node = NULL; +xmlNodePtr tmp_node = NULL; xmlNodePtr mpd_baseurl_node = NULL; xmlNodePtr period_baseurl_node = NULL; xmlNodePtr period_segmenttemplate_node = NULL; @@ -1215,8 +1220,10 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in) xmlFree(val); } -mpd_baseurl_node = find_child_node_by_name(node, "BaseURL"); -if (!mpd_baseurl_node) { +tmp_node = find_child_node_by_name(node, "BaseURL"); +if (tmp_node) { +mpd_baseurl_node = xmlCopyNode(tmp_node,1); +} else { mpd_baseurl_node = xmlNewNode(NULL, "BaseURL"); } @@ -1270,6 +1277,7 @@ cleanup: /*free the document */ xmlFreeDoc(doc); xmlCleanupParser(); +xmlFreeNode(mpd_baseurl_node); } av_free(new_url); ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog