From c60b266eac18e69382a965a375233e3bbfa91229 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 2 May 2014 15:57:59 +0200 Subject: [PATCH] avcodec/mpegvideo: support disabling motion compensation This allows analyzing videos without having prior and current frames mixed Signed-off-by: Michael Niedermayer --- libavcodec/avcodec.h | 1 + libavcodec/mpegvideo.c | 45 ++++++++++++++++++++++++++++++++++++++ libavcodec/options_table.h | 1 + 3 files changed, 47 insertions(+) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 5c5d458ec5..94184758c9 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -2587,6 +2587,7 @@ typedef struct AVCodecContext { #endif #define FF_DEBUG_BUFFERS 0x00008000 #define FF_DEBUG_THREADS 0x00010000 +#define FF_DEBUG_NOMC 0x01000000 #if FF_API_DEBUG_MV /** diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 48897d4998..ae507d0069 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -340,6 +340,18 @@ static void mpeg_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type, ff_MPV_decode_mb(s, s->block); } +static void gray16(uint8_t *dst, uint8_t *src, int linesize, int h) +{ + while(h--) + memset(dst + h*linesize, 128, 16); +} + +static void gray8(uint8_t *dst, uint8_t *src, int linesize, int h) +{ + while(h--) + memset(dst + h*linesize, 128, 8); +} + /* init common dct for both encoder and decoder */ av_cold int ff_dct_common_init(MpegEncContext *s) { @@ -348,6 +360,19 @@ av_cold int ff_dct_common_init(MpegEncContext *s) ff_hpeldsp_init(&s->hdsp, s->avctx->flags); ff_videodsp_init(&s->vdsp, s->avctx->bits_per_raw_sample); + if (s->avctx->debug & FF_DEBUG_NOMC) { + int i; + for (i=0; i<4; i++) { + s->hdsp.avg_pixels_tab[0][i] = gray16; + s->hdsp.put_pixels_tab[0][i] = gray16; + s->hdsp.put_no_rnd_pixels_tab[0][i] = gray16; + + s->hdsp.avg_pixels_tab[1][i] = gray8; + s->hdsp.put_pixels_tab[1][i] = gray8; + s->hdsp.put_no_rnd_pixels_tab[1][i] = gray8; + } + } + s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c; s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c; s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c; @@ -1656,6 +1681,22 @@ int ff_find_unused_picture(MpegEncContext *s, int shared) return ret; } +static void gray_frame(AVFrame *frame) +{ + int i, h_chroma_shift, v_chroma_shift; + + av_pix_fmt_get_chroma_sub_sample(frame->format, &h_chroma_shift, &v_chroma_shift); + + for(i=0; iheight; i++) + memset(frame->data[0] + frame->linesize[0]*i, 0x80, frame->width); + for(i=0; iheight, v_chroma_shift); i++) { + memset(frame->data[1] + frame->linesize[1]*i, + 0x80, FF_CEIL_RSHIFT(frame->width, h_chroma_shift)); + memset(frame->data[2] + frame->linesize[2]*i, + 0x80, FF_CEIL_RSHIFT(frame->width, h_chroma_shift)); + } +} + /** * generic function called after decoding * the header and before a frame is decoded. @@ -1882,6 +1923,10 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter; } + if (s->avctx->debug & FF_DEBUG_NOMC) { + gray_frame(s->current_picture_ptr->f); + } + return 0; } diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h index 822c065442..a22d9e4d92 100644 --- a/libavcodec/options_table.h +++ b/libavcodec/options_table.h @@ -248,6 +248,7 @@ static const AVOption avcodec_options[] = { {"vis_mb_type", "visualize block types", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_VIS_MB_TYPE }, INT_MIN, INT_MAX, V|D, "debug"}, {"buffers", "picture buffer allocations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BUFFERS }, INT_MIN, INT_MAX, V|D, "debug"}, {"thread_ops", "threading operations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_THREADS }, INT_MIN, INT_MAX, V|A|D, "debug"}, +{"nomc", "skip motion compensation", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_NOMC }, INT_MIN, INT_MAX, V|A|D, "debug"}, {"vismv", "visualize motion vectors (MVs)", OFFSET(debug_mv), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, V|D, "debug_mv"}, {"pf", "forward predicted MVs of P-frames", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_VIS_MV_P_FOR }, INT_MIN, INT_MAX, V|D, "debug_mv"}, {"bf", "forward predicted MVs of B-frames", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_VIS_MV_B_FOR }, INT_MIN, INT_MAX, V|D, "debug_mv"},