Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/libavcodec/ituh263dec.c b/libavcodec/ituh263dec.c
- index dc3de30..0256f41 100644
- --- a/libavcodec/ituh263dec.c
- +++ b/libavcodec/ituh263dec.c
- @@ -1095,7 +1095,6 @@ int ff_h263_decode_picture_header(MpegEncContext *s)
- s->pp_time = 2;
- s->pb_time = 1;
- }
- - ff_mpeg4_init_direct_mv(s);
- }
- /* PEI */
- diff --git a/libavcodec/mpeg4video.c b/libavcodec/mpeg4video.c
- index 84fa26b..69e469b 100644
- --- a/libavcodec/mpeg4video.c
- +++ b/libavcodec/mpeg4video.c
- @@ -74,23 +74,26 @@ void ff_mpeg4_clean_buffers(MpegEncContext *s)
- s->last_mv[1][0][1] = 0;
- }
- -#define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0]))
- +Mpeg4DecContext *ctx;
- +
- +#define tab_size ((signed)FF_ARRAY_ELEMS(ctx->direct_scale_mv[0]))
- #define tab_bias (tab_size / 2)
- -// used by mpeg4 and rv10 decoder
- -void ff_mpeg4_init_direct_mv(MpegEncContext *s)
- +void ff_mpeg4_init_direct_mv(Mpeg4DecContext *ctx)
- {
- int i;
- + MpegEncContext *s = &ctx->m;
- for (i = 0; i < tab_size; i++) {
- - s->direct_scale_mv[0][i] = (i - tab_bias) * s->pb_time / s->pp_time;
- - s->direct_scale_mv[1][i] = (i - tab_bias) * (s->pb_time - s->pp_time) /
- + ctx->direct_scale_mv[0][i] = (i - tab_bias) * s->pb_time / s->pp_time;
- + ctx->direct_scale_mv[1][i] = (i - tab_bias) * (s->pb_time - s->pp_time) /
- s->pp_time;
- }
- }
- -static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx,
- +static inline void ff_mpeg4_set_one_direct_mv(Mpeg4DecContext *ctx, int mx,
- int my, int i)
- {
- + MpegEncContext *s = &ctx->m;
- int xy = s->block_index[i];
- uint16_t time_pp = s->pp_time;
- uint16_t time_pb = s->pb_time;
- @@ -98,9 +101,9 @@ static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx,
- p_mx = s->next_picture.motion_val[0][xy][0];
- if ((unsigned)(p_mx + tab_bias) < tab_size) {
- - s->mv[0][i][0] = s->direct_scale_mv[0][p_mx + tab_bias] + mx;
- + s->mv[0][i][0] = ctx->direct_scale_mv[0][p_mx + tab_bias] + mx;
- s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
- - : s->direct_scale_mv[1][p_mx + tab_bias];
- + : ctx->direct_scale_mv[1][p_mx + tab_bias];
- } else {
- s->mv[0][i][0] = p_mx * time_pb / time_pp + mx;
- s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
- @@ -108,9 +111,9 @@ static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx,
- }
- p_my = s->next_picture.motion_val[0][xy][1];
- if ((unsigned)(p_my + tab_bias) < tab_size) {
- - s->mv[0][i][1] = s->direct_scale_mv[0][p_my + tab_bias] + my;
- + s->mv[0][i][1] = ctx->direct_scale_mv[0][p_my + tab_bias] + my;
- s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
- - : s->direct_scale_mv[1][p_my + tab_bias];
- + : ctx->direct_scale_mv[1][p_my + tab_bias];
- } else {
- s->mv[0][i][1] = p_my * time_pb / time_pp + my;
- s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
- @@ -126,11 +129,16 @@ static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx,
- */
- int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
- {
- + Mpeg4DecContext *ctx;
- const int mb_index = s->mb_x + s->mb_y * s->mb_stride;
- const int colocated_mb_type = s->next_picture.mb_type[mb_index];
- uint16_t time_pp;
- uint16_t time_pb;
- int i;
- + ctx = av_malloc(sizeof(Mpeg4DecContext));
- + if (!ctx)
- + return AVERROR(ENOMEM);
- + ctx->m = *s;
- // FIXME avoid divides
- // try special case with shifts for 1 and 3 B-frames?
- @@ -138,7 +146,7 @@ int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
- if (IS_8X8(colocated_mb_type)) {
- s->mv_type = MV_TYPE_8X8;
- for (i = 0; i < 4; i++)
- - ff_mpeg4_set_one_direct_mv(s, mx, my, i);
- + ff_mpeg4_set_one_direct_mv(ctx, mx, my, i);
- return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
- } else if (IS_INTERLACED(colocated_mb_type)) {
- s->mv_type = MV_TYPE_FIELD;
- @@ -169,7 +177,7 @@ int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
- return MB_TYPE_DIRECT2 | MB_TYPE_16x8 |
- MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
- } else {
- - ff_mpeg4_set_one_direct_mv(s, mx, my, 0);
- + ff_mpeg4_set_one_direct_mv(ctx, mx, my, 0);
- s->mv[0][1][0] =
- s->mv[0][2][0] =
- s->mv[0][3][0] = s->mv[0][0][0];
- diff --git a/libavcodec/mpeg4video.h b/libavcodec/mpeg4video.h
- index b092684..a87ccfb 100644
- --- a/libavcodec/mpeg4video.h
- +++ b/libavcodec/mpeg4video.h
- @@ -100,6 +100,9 @@ typedef struct Mpeg4DecContext {
- int cplx_estimation_trash_i;
- int cplx_estimation_trash_p;
- int cplx_estimation_trash_b;
- +
- + int16_t direct_scale_mv[2][64]; ///< precomputed to avoid divisions in ff_mpeg4_set_direct_mv
- +
- } Mpeg4DecContext;
- /* dc encoding for mpeg4 */
- @@ -147,7 +150,7 @@ void ff_clean_mpeg4_qscales(MpegEncContext *s);
- int ff_mpeg4_decode_partitions(Mpeg4DecContext *ctx);
- int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s);
- int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx);
- -void ff_mpeg4_init_direct_mv(MpegEncContext *s);
- +void ff_mpeg4_init_direct_mv(Mpeg4DecContext *ctx);
- int ff_mpeg4_frame_end(AVCodecContext *avctx, const uint8_t *buf, int buf_size);
- /**
- diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c
- index 199e3b3..b1db0e1 100644
- --- a/libavcodec/mpeg4videodec.c
- +++ b/libavcodec/mpeg4videodec.c
- @@ -2151,7 +2151,7 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb)
- /* messed up order, maybe after seeking? skipping current b-frame */
- return FRAME_SKIPPED;
- }
- - ff_mpeg4_init_direct_mv(s);
- + ff_mpeg4_init_direct_mv(ctx);
- if (ctx->t_frame == 0)
- ctx->t_frame = s->pb_time;
- diff --git a/libavcodec/mpeg4videoenc.c b/libavcodec/mpeg4videoenc.c
- index 6b87ec7..cb05914 100644
- --- a/libavcodec/mpeg4videoenc.c
- +++ b/libavcodec/mpeg4videoenc.c
- @@ -890,9 +890,7 @@ void ff_mpeg4_stuffing(PutBitContext *pbc)
- /* must be called before writing the header */
- void ff_set_mpeg4_time(MpegEncContext *s)
- {
- - if (s->pict_type == AV_PICTURE_TYPE_B) {
- - ff_mpeg4_init_direct_mv(s);
- - } else {
- + if (s->pict_type != AV_PICTURE_TYPE_B) {
- s->last_time_base = s->time_base;
- s->time_base = s->time / s->avctx->time_base.den;
- }
- diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
- index 1333d44..6e36fda 100644
- --- a/libavcodec/mpegvideo.h
- +++ b/libavcodec/mpegvideo.h
- @@ -399,7 +399,6 @@ typedef struct MpegEncContext {
- int field_select[2][2];
- int last_mv[2][2][2]; ///< last MV, used for MV prediction in MPEG1 & B-frame MPEG4
- uint8_t *fcode_tab; ///< smallest fcode needed for each MV
- - int16_t direct_scale_mv[2][64]; ///< precomputed to avoid divisions in ff_mpeg4_set_direct_mv
- MotionEstContext me;
- diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c
- index 835a1aa..3d1b51d 100644
- --- a/libavcodec/rv10.c
- +++ b/libavcodec/rv10.c
- @@ -412,7 +412,6 @@ static int rv20_decode_picture_header(RVDecContext *rv)
- "from seeking? skipping current b frame\n");
- return FRAME_SKIPPED;
- }
- - ff_mpeg4_init_direct_mv(s);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement