diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2015-03-21 20:10:49 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-03-21 20:16:21 +0100 |
commit | 84ae7294cbaa413b80d632f79d539270dd4bd6b5 (patch) | |
tree | e44e4c10830565c3072d871405c57a64661eef85 | |
parent | 830e548b9ec32ad7ab02be056db15cbcf3c58346 (diff) | |
parent | 3178f4d33ff62243f7cdddb081db516ea34396c9 (diff) | |
download | ffmpeg-84ae7294cbaa413b80d632f79d539270dd4bd6b5.tar.gz |
Merge commit '3178f4d33ff62243f7cdddb081db516ea34396c9'
* commit '3178f4d33ff62243f7cdddb081db516ea34396c9':
h264: move rbsp_buffer into the per-slice context
Conflicts:
libavcodec/h264.c
libavcodec/h264_parser.c
libavcodec/h264_slice.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/h264.c | 22 | ||||
-rw-r--r-- | libavcodec/h264.h | 8 | ||||
-rw-r--r-- | libavcodec/h264_parser.c | 2 | ||||
-rw-r--r-- | libavcodec/h264_slice.c | 4 |
4 files changed, 17 insertions, 19 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 63f063a7f3..4a19a2e357 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -233,7 +233,8 @@ int ff_h264_check_intra_pred_mode(const H264Context *h, H264SliceContext *sl, return mode; } -const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, +const uint8_t *ff_h264_decode_nal(H264Context *h, H264SliceContext *sl, + const uint8_t *src, int *dst_length, int *consumed, int length) { int i, si, di; @@ -293,8 +294,8 @@ const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, } #endif - av_fast_padded_malloc(&h->rbsp_buffer, &h->rbsp_buffer_size, length+MAX_MBPAIR_SIZE); - dst = h->rbsp_buffer; + av_fast_padded_malloc(&sl->rbsp_buffer, &sl->rbsp_buffer_size, length+MAX_MBPAIR_SIZE); + dst = sl->rbsp_buffer; if (!dst) return NULL; @@ -402,10 +403,6 @@ void ff_h264_free_tables(H264Context *h, int free_rbsp) if (!hx) continue; - if (free_rbsp) { - av_freep(&hx->rbsp_buffer); - hx->rbsp_buffer_size = 0; - } if (i) av_freep(&h->thread_context[i]); } @@ -427,6 +424,11 @@ void ff_h264_free_tables(H264Context *h, int free_rbsp) sl->edge_emu_buffer_allocated = 0; sl->top_borders_allocated[0] = 0; sl->top_borders_allocated[1] = 0; + + if (free_rbsp) { + av_freep(&sl->rbsp_buffer); + sl->rbsp_buffer_size = 0; + } } } @@ -745,8 +747,6 @@ static int decode_init_thread_copy(AVCodecContext *avctx) h->slice_ctx[i].h264 = h; h->avctx = avctx; - h->rbsp_buffer = NULL; - h->rbsp_buffer_size = 0; h->context_initialized = 0; return 0; @@ -1392,7 +1392,7 @@ static int get_last_needed_nal(H264Context *h, const uint8_t *buf, int buf_size) continue; } - ptr = ff_h264_decode_nal(h, buf + buf_index, &dst_length, &consumed, + ptr = ff_h264_decode_nal(h, &h->slice_ctx[0], buf + buf_index, &dst_length, &consumed, next_avc - buf_index); if (!ptr || dst_length < 0) @@ -1494,7 +1494,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size, hx = h->thread_context[context_count]; sl = &h->slice_ctx[context_count]; - ptr = ff_h264_decode_nal(hx, buf + buf_index, &dst_length, + ptr = ff_h264_decode_nal(hx, sl, buf + buf_index, &dst_length, &consumed, next_avc - buf_index); if (!ptr || dst_length < 0) { ret = -1; diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 5793f0e471..2df2dfa306 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -476,6 +476,10 @@ typedef struct H264SliceContext { CABACContext cabac; uint8_t cabac_state[1024]; int cabac_init_idc; + + // rbsp buffer used for this slice + uint8_t *rbsp_buffer; + unsigned int rbsp_buffer_size; } H264SliceContext; /** @@ -585,8 +589,6 @@ typedef struct H264Context { int nal_ref_idc; int nal_unit_type; - uint8_t *rbsp_buffer; - unsigned int rbsp_buffer_size; /** * Used to parse AVC variant of h264 @@ -817,7 +819,7 @@ int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length); * or a decode rbsp tailing? * @return decoded bytes, might be src+1 if no escapes */ -const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, +const uint8_t *ff_h264_decode_nal(H264Context *h, H264SliceContext *sl, const uint8_t *src, int *dst_length, int *consumed, int length); /** diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c index 6aec473a9f..f4b97e6761 100644 --- a/libavcodec/h264_parser.c +++ b/libavcodec/h264_parser.c @@ -272,7 +272,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, } break; } - ptr = ff_h264_decode_nal(h, buf + buf_index, &dst_length, + ptr = ff_h264_decode_nal(h, sl, buf + buf_index, &dst_length, &consumed, src_length); if (!ptr || dst_length < 0) break; diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 2cce5547ea..fbabd1ece7 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -538,7 +538,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst, for (i = 0; i < MAX_PPS_COUNT; i++) av_freep(h->pps_buffers + i); - av_freep(&h->rbsp_buffer); ff_h264_unref_picture(h, &h->last_pic_for_ec); memcpy(h, h1, sizeof(H264Context)); @@ -572,8 +571,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst, h->list_counts = NULL; h->mb2b_xy = NULL; h->mb2br_xy = NULL; - h->rbsp_buffer = NULL; - h->rbsp_buffer_size = 0; if (h1->context_initialized) { h->context_initialized = 0; @@ -594,7 +591,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst, } } - h->thread_context[0] = h; h->context_initialized = h1->context_initialized; } |