diff options
author | Anton Khirnov <anton@khirnov.net> | 2013-02-03 11:10:05 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2013-02-15 16:35:16 +0100 |
commit | 2c541554076cc8a72e7145d4da30389ca763f32f (patch) | |
tree | b404051a202e1ffffe4ecee2df1b89f9f92a70f5 /libavcodec/h264_mvpred.h | |
parent | 1d0feb5d1ac04d187b335f0e8d411c9f40b3a885 (diff) | |
download | ffmpeg-2c541554076cc8a72e7145d4da30389ca763f32f.tar.gz |
h264: deMpegEncContextize
Most of the changes are just trivial are just trivial replacements of
fields from MpegEncContext with equivalent fields in H264Context.
Everything in h264* other than h264.c are those trivial changes.
The nontrivial parts are:
1) extracting a simplified version of the frame management code from
mpegvideo.c. We don't need last/next_picture anymore, since h264 uses
its own more complex system already and those were set only to appease
the mpegvideo parts.
2) some tables that need to be allocated/freed in appropriate places.
3) hwaccels -- mostly trivial replacements.
for dxva, the draw_horiz_band() call is moved from
ff_dxva2_common_end_frame() to per-codec end_frame() callbacks,
because it's now different for h264 and MpegEncContext-based
decoders.
4) svq3 -- it does not use h264 complex reference system, so I just
added some very simplistic frame management instead and dropped the
use of ff_h264_frame_start(). Because of this I also had to move some
initialization code to svq3.
Additional fixes for chroma format and bit depth changes by
Janne Grunau <janne-libav@jannau.net>
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Diffstat (limited to 'libavcodec/h264_mvpred.h')
-rw-r--r-- | libavcodec/h264_mvpred.h | 97 |
1 files changed, 46 insertions, 51 deletions
diff --git a/libavcodec/h264_mvpred.h b/libavcodec/h264_mvpred.h index 5244c290f2..b49ff31c15 100644 --- a/libavcodec/h264_mvpred.h +++ b/libavcodec/h264_mvpred.h @@ -39,32 +39,31 @@ static av_always_inline int fetch_diagonal_mv(H264Context *h, const int16_t **C, int i, int list, int part_width) { const int topright_ref = h->ref_cache[list][i - 8 + part_width]; - MpegEncContext *s = &h->s; /* there is no consistent mapping of mvs to neighboring locations that will * make mbaff happy, so we can't move all this logic to fill_caches */ if (FRAME_MBAFF) { #define SET_DIAG_MV(MV_OP, REF_OP, XY, Y4) \ const int xy = XY, y4 = Y4; \ - const int mb_type = mb_types[xy + (y4 >> 2) * s->mb_stride]; \ + const int mb_type = mb_types[xy + (y4 >> 2) * h->mb_stride]; \ if (!USES_LIST(mb_type, list)) \ return LIST_NOT_USED; \ - mv = s->current_picture_ptr->f.motion_val[list][h->mb2b_xy[xy] + 3 + y4 * h->b_stride]; \ + mv = h->cur_pic_ptr->f.motion_val[list][h->mb2b_xy[xy] + 3 + y4 * h->b_stride]; \ h->mv_cache[list][scan8[0] - 2][0] = mv[0]; \ h->mv_cache[list][scan8[0] - 2][1] = mv[1] MV_OP; \ - return s->current_picture_ptr->f.ref_index[list][4 * xy + 1 + (y4 & ~1)] REF_OP; + return h->cur_pic_ptr->f.ref_index[list][4 * xy + 1 + (y4 & ~1)] REF_OP; if (topright_ref == PART_NOT_AVAILABLE && i >= scan8[0] + 8 && (i & 7) == 4 && h->ref_cache[list][scan8[0] - 1] != PART_NOT_AVAILABLE) { - const uint32_t *mb_types = s->current_picture_ptr->f.mb_type; + const uint32_t *mb_types = h->cur_pic_ptr->f.mb_type; const int16_t *mv; AV_ZERO32(h->mv_cache[list][scan8[0] - 2]); *C = h->mv_cache[list][scan8[0] - 2]; if (!MB_FIELD && IS_INTERLACED(h->left_type[0])) { - SET_DIAG_MV(* 2, >> 1, h->left_mb_xy[0] + s->mb_stride, - (s->mb_y & 1) * 2 + (i >> 5)); + SET_DIAG_MV(* 2, >> 1, h->left_mb_xy[0] + h->mb_stride, + (h->mb_y & 1) * 2 + (i >> 5)); } if (MB_FIELD && !IS_INTERLACED(h->left_type[0])) { // left shift will turn LIST_NOT_USED into PART_NOT_AVAILABLE, but that's OK. @@ -78,7 +77,7 @@ static av_always_inline int fetch_diagonal_mv(H264Context *h, const int16_t **C, *C = h->mv_cache[list][i - 8 + part_width]; return topright_ref; } else { - tprintf(s->avctx, "topright MV not available\n"); + tprintf(h->avctx, "topright MV not available\n"); *C = h->mv_cache[list][i - 8 - 1]; return h->ref_cache[list][i - 8 - 1]; @@ -116,7 +115,7 @@ static av_always_inline void pred_motion(H264Context *const h, int n, diagonal_ref = fetch_diagonal_mv(h, &C, index8, list, part_width); match_count = (diagonal_ref == ref) + (top_ref == ref) + (left_ref == ref); - tprintf(h->s.avctx, "pred_motion match_count=%d\n", match_count); + tprintf(h->avctx, "pred_motion match_count=%d\n", match_count); if (match_count > 1) { //most common *mx = mid_pred(A[0], B[0], C[0]); *my = mid_pred(A[1], B[1], C[1]); @@ -143,10 +142,10 @@ static av_always_inline void pred_motion(H264Context *const h, int n, } } - tprintf(h->s.avctx, + tprintf(h->avctx, "pred_motion (%2d %2d %2d) (%2d %2d %2d) (%2d %2d %2d) -> (%2d %2d %2d) at %2d %2d %d list %d\n", top_ref, B[0], B[1], diagonal_ref, C[0], C[1], left_ref, - A[0], A[1], ref, *mx, *my, h->s.mb_x, h->s.mb_y, n, list); + A[0], A[1], ref, *mx, *my, h->mb_x, h->mb_y, n, list); } /** @@ -163,8 +162,8 @@ static av_always_inline void pred_16x8_motion(H264Context *const h, const int top_ref = h->ref_cache[list][scan8[0] - 8]; const int16_t *const B = h->mv_cache[list][scan8[0] - 8]; - tprintf(h->s.avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", - top_ref, B[0], B[1], h->s.mb_x, h->s.mb_y, n, list); + tprintf(h->avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", + top_ref, B[0], B[1], h->mb_x, h->mb_y, n, list); if (top_ref == ref) { *mx = B[0]; @@ -175,8 +174,8 @@ static av_always_inline void pred_16x8_motion(H264Context *const h, const int left_ref = h->ref_cache[list][scan8[8] - 1]; const int16_t *const A = h->mv_cache[list][scan8[8] - 1]; - tprintf(h->s.avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", - left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list); + tprintf(h->avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", + left_ref, A[0], A[1], h->mb_x, h->mb_y, n, list); if (left_ref == ref) { *mx = A[0]; @@ -203,8 +202,8 @@ static av_always_inline void pred_8x16_motion(H264Context *const h, const int left_ref = h->ref_cache[list][scan8[0] - 1]; const int16_t *const A = h->mv_cache[list][scan8[0] - 1]; - tprintf(h->s.avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", - left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list); + tprintf(h->avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", + left_ref, A[0], A[1], h->mb_x, h->mb_y, n, list); if (left_ref == ref) { *mx = A[0]; @@ -217,8 +216,8 @@ static av_always_inline void pred_8x16_motion(H264Context *const h, diagonal_ref = fetch_diagonal_mv(h, &C, scan8[4], list, 2); - tprintf(h->s.avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", - diagonal_ref, C[0], C[1], h->s.mb_x, h->s.mb_y, n, list); + tprintf(h->avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", + diagonal_ref, C[0], C[1], h->mb_x, h->mb_y, n, list); if (diagonal_ref == ref) { *mx = C[0]; @@ -254,9 +253,8 @@ static av_always_inline void pred_pskip_motion(H264Context *const h) { DECLARE_ALIGNED(4, static const int16_t, zeromv)[2] = { 0 }; DECLARE_ALIGNED(4, int16_t, mvbuf)[3][2]; - MpegEncContext *const s = &h->s; - int8_t *ref = s->current_picture.f.ref_index[0]; - int16_t(*mv)[2] = s->current_picture.f.motion_val[0]; + int8_t *ref = h->cur_pic.f.ref_index[0]; + int16_t(*mv)[2] = h->cur_pic.f.motion_val[0]; int top_ref, left_ref, diagonal_ref, match_count, mx, my; const int16_t *A, *B, *C; int b_stride = h->b_stride; @@ -294,8 +292,8 @@ static av_always_inline void pred_pskip_motion(H264Context *const h) goto zeromv; } - tprintf(h->s.avctx, "pred_pskip: (%d) (%d) at %2d %2d\n", - top_ref, left_ref, h->s.mb_x, h->s.mb_y); + tprintf(h->avctx, "pred_pskip: (%d) (%d) at %2d %2d\n", + top_ref, left_ref, h->mb_x, h->mb_y); if (USES_LIST(h->topright_type, 0)) { diagonal_ref = ref[4 * h->topright_mb_xy + 2]; @@ -321,7 +319,7 @@ static av_always_inline void pred_pskip_motion(H264Context *const h) } match_count = !diagonal_ref + !top_ref + !left_ref; - tprintf(h->s.avctx, "pred_pskip_motion match_count=%d\n", match_count); + tprintf(h->avctx, "pred_pskip_motion match_count=%d\n", match_count); if (match_count > 1) { mx = mid_pred(A[0], B[0], C[0]); my = mid_pred(A[1], B[1], C[1]); @@ -351,7 +349,6 @@ zeromv: static void fill_decode_neighbors(H264Context *h, int mb_type) { - MpegEncContext *const s = &h->s; const int mb_xy = h->mb_xy; int topleft_xy, top_xy, topright_xy, left_xy[LEFT_MBS]; static const uint8_t left_block_options[4][32] = { @@ -363,7 +360,7 @@ static void fill_decode_neighbors(H264Context *h, int mb_type) h->topleft_partition = -1; - top_xy = mb_xy - (s->mb_stride << MB_FIELD); + top_xy = mb_xy - (h->mb_stride << MB_FIELD); /* Wow, what a mess, why didn't they simplify the interlacing & intra * stuff, I can't imagine that these complex rules are worth it. */ @@ -373,16 +370,16 @@ static void fill_decode_neighbors(H264Context *h, int mb_type) left_xy[LBOT] = left_xy[LTOP] = mb_xy - 1; h->left_block = left_block_options[0]; if (FRAME_MBAFF) { - const int left_mb_field_flag = IS_INTERLACED(s->current_picture.f.mb_type[mb_xy - 1]); + const int left_mb_field_flag = IS_INTERLACED(h->cur_pic.f.mb_type[mb_xy - 1]); const int curr_mb_field_flag = IS_INTERLACED(mb_type); - if (s->mb_y & 1) { + if (h->mb_y & 1) { if (left_mb_field_flag != curr_mb_field_flag) { - left_xy[LBOT] = left_xy[LTOP] = mb_xy - s->mb_stride - 1; + left_xy[LBOT] = left_xy[LTOP] = mb_xy - h->mb_stride - 1; if (curr_mb_field_flag) { - left_xy[LBOT] += s->mb_stride; + left_xy[LBOT] += h->mb_stride; h->left_block = left_block_options[3]; } else { - topleft_xy += s->mb_stride; + topleft_xy += h->mb_stride; /* take top left mv from the middle of the mb, as opposed * to all other modes which use the bottom right partition */ h->topleft_partition = 0; @@ -391,13 +388,13 @@ static void fill_decode_neighbors(H264Context *h, int mb_type) } } else { if (curr_mb_field_flag) { - topleft_xy += s->mb_stride & (((s->current_picture.f.mb_type[top_xy - 1] >> 7) & 1) - 1); - topright_xy += s->mb_stride & (((s->current_picture.f.mb_type[top_xy + 1] >> 7) & 1) - 1); - top_xy += s->mb_stride & (((s->current_picture.f.mb_type[top_xy] >> 7) & 1) - 1); + topleft_xy += h->mb_stride & (((h->cur_pic.f.mb_type[top_xy - 1] >> 7) & 1) - 1); + topright_xy += h->mb_stride & (((h->cur_pic.f.mb_type[top_xy + 1] >> 7) & 1) - 1); + top_xy += h->mb_stride & (((h->cur_pic.f.mb_type[top_xy] >> 7) & 1) - 1); } if (left_mb_field_flag != curr_mb_field_flag) { if (curr_mb_field_flag) { - left_xy[LBOT] += s->mb_stride; + left_xy[LBOT] += h->mb_stride; h->left_block = left_block_options[3]; } else { h->left_block = left_block_options[2]; @@ -413,11 +410,11 @@ static void fill_decode_neighbors(H264Context *h, int mb_type) h->left_mb_xy[LBOT] = left_xy[LBOT]; //FIXME do we need all in the context? - h->topleft_type = s->current_picture.f.mb_type[topleft_xy]; - h->top_type = s->current_picture.f.mb_type[top_xy]; - h->topright_type = s->current_picture.f.mb_type[topright_xy]; - h->left_type[LTOP] = s->current_picture.f.mb_type[left_xy[LTOP]]; - h->left_type[LBOT] = s->current_picture.f.mb_type[left_xy[LBOT]]; + h->topleft_type = h->cur_pic.f.mb_type[topleft_xy]; + h->top_type = h->cur_pic.f.mb_type[top_xy]; + h->topright_type = h->cur_pic.f.mb_type[topright_xy]; + h->left_type[LTOP] = h->cur_pic.f.mb_type[left_xy[LTOP]]; + h->left_type[LBOT] = h->cur_pic.f.mb_type[left_xy[LBOT]]; if (FMO) { if (h->slice_table[topleft_xy] != h->slice_num) @@ -441,7 +438,6 @@ static void fill_decode_neighbors(H264Context *h, int mb_type) static void fill_decode_caches(H264Context *h, int mb_type) { - MpegEncContext *const s = &h->s; int topleft_xy, top_xy, topright_xy, left_xy[LEFT_MBS]; int topleft_type, top_type, topright_type, left_type[LEFT_MBS]; const uint8_t *left_block = h->left_block; @@ -484,7 +480,7 @@ static void fill_decode_caches(H264Context *h, int mb_type) h->left_samples_available &= 0xFF5F; } } else { - int left_typei = s->current_picture.f.mb_type[left_xy[LTOP] + s->mb_stride]; + int left_typei = h->cur_pic.f.mb_type[left_xy[LTOP] + h->mb_stride]; assert(left_xy[LTOP] == left_xy[LBOT]); if (!((left_typei & type_mask) && (left_type[LTOP] & type_mask))) { @@ -541,7 +537,7 @@ static void fill_decode_caches(H264Context *h, int mb_type) if (top_type) { nnz = h->non_zero_count[top_xy]; AV_COPY32(&nnz_cache[4 + 8 * 0], &nnz[4 * 3]); - if (!s->chroma_y_shift) { + if (!h->chroma_y_shift) { AV_COPY32(&nnz_cache[4 + 8 * 5], &nnz[4 * 7]); AV_COPY32(&nnz_cache[4 + 8 * 10], &nnz[4 * 11]); } else { @@ -606,9 +602,9 @@ static void fill_decode_caches(H264Context *h, int mb_type) int b_stride = h->b_stride; for (list = 0; list < h->list_count; list++) { int8_t *ref_cache = &h->ref_cache[list][scan8[0]]; - int8_t *ref = s->current_picture.f.ref_index[list]; + int8_t *ref = h->cur_pic.f.ref_index[list]; int16_t(*mv_cache)[2] = &h->mv_cache[list][scan8[0]]; - int16_t(*mv)[2] = s->current_picture.f.motion_val[list]; + int16_t(*mv)[2] = h->cur_pic.f.motion_val[list]; if (!USES_LIST(mb_type, list)) continue; assert(!(IS_DIRECT(mb_type) && !h->direct_spatial_mv_pred)); @@ -800,7 +796,6 @@ static void fill_decode_caches(H264Context *h, int mb_type) */ static void av_unused decode_mb_skip(H264Context *h) { - MpegEncContext *const s = &h->s; const int mb_xy = h->mb_xy; int mb_type = 0; @@ -826,10 +821,10 @@ static void av_unused decode_mb_skip(H264Context *h) } write_back_motion(h, mb_type); - s->current_picture.f.mb_type[mb_xy] = mb_type; - s->current_picture.f.qscale_table[mb_xy] = s->qscale; - h->slice_table[mb_xy] = h->slice_num; - h->prev_mb_skipped = 1; + h->cur_pic.f.mb_type[mb_xy] = mb_type; + h->cur_pic.f.qscale_table[mb_xy] = h->qscale; + h->slice_table[mb_xy] = h->slice_num; + h->prev_mb_skipped = 1; } #endif /* AVCODEC_H264_MVPRED_H */ |