h264: move rbsp_buffer into the per-slice context

This commit is contained in:
Anton Khirnov 2015-01-17 22:28:46 +01:00
parent 582683b6ac
commit 3178f4d33f
4 changed files with 17 additions and 18 deletions

View File

@ -216,7 +216,8 @@ int ff_h264_check_intra_pred_mode(const H264Context *h, H264SliceContext *sl,
return mode; 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 *dst_length, int *consumed, int length)
{ {
int i, si, di; int i, si, di;
@ -282,9 +283,9 @@ const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src,
return src; return src;
} }
av_fast_malloc(&h->rbsp_buffer, &h->rbsp_buffer_size, av_fast_malloc(&sl->rbsp_buffer, &sl->rbsp_buffer_size,
length + FF_INPUT_BUFFER_PADDING_SIZE); length + FF_INPUT_BUFFER_PADDING_SIZE);
dst = h->rbsp_buffer; dst = sl->rbsp_buffer;
if (!dst) if (!dst)
return NULL; return NULL;
@ -380,10 +381,6 @@ void ff_h264_free_tables(H264Context *h, int free_rbsp)
if (!hx) if (!hx)
continue; continue;
if (free_rbsp) {
av_freep(&hx->rbsp_buffer);
hx->rbsp_buffer_size = 0;
}
if (i) if (i)
av_freep(&h->thread_context[i]); av_freep(&h->thread_context[i]);
} }
@ -405,6 +402,11 @@ void ff_h264_free_tables(H264Context *h, int free_rbsp)
sl->edge_emu_buffer_allocated = 0; sl->edge_emu_buffer_allocated = 0;
sl->top_borders_allocated[0] = 0; sl->top_borders_allocated[0] = 0;
sl->top_borders_allocated[1] = 0; sl->top_borders_allocated[1] = 0;
if (free_rbsp) {
av_freep(&sl->rbsp_buffer);
sl->rbsp_buffer_size = 0;
}
} }
} }
@ -709,8 +711,6 @@ static int decode_init_thread_copy(AVCodecContext *avctx)
h->slice_ctx[i].h264 = h; h->slice_ctx[i].h264 = h;
h->avctx = avctx; h->avctx = avctx;
h->rbsp_buffer = NULL;
h->rbsp_buffer_size = 0;
h->context_initialized = 0; h->context_initialized = 0;
return 0; return 0;
@ -1385,7 +1385,7 @@ static int get_last_needed_nal(H264Context *h, const uint8_t *buf, int buf_size)
break; break;
} }
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); next_avc - buf_index);
if (!ptr || dst_length < 0) if (!ptr || dst_length < 0)
@ -1471,7 +1471,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
hx = h->thread_context[context_count]; hx = h->thread_context[context_count];
sl = &h->slice_ctx[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); &consumed, next_avc - buf_index);
if (!ptr || dst_length < 0) { if (!ptr || dst_length < 0) {
ret = -1; ret = -1;

View File

@ -439,6 +439,10 @@ typedef struct H264SliceContext {
CABACContext cabac; CABACContext cabac;
uint8_t cabac_state[1024]; uint8_t cabac_state[1024];
int cabac_init_idc; int cabac_init_idc;
// rbsp buffer used for this slice
uint8_t *rbsp_buffer;
unsigned int rbsp_buffer_size;
} H264SliceContext; } H264SliceContext;
/** /**
@ -542,8 +546,6 @@ typedef struct H264Context {
int nal_ref_idc; int nal_ref_idc;
int nal_unit_type; int nal_unit_type;
uint8_t *rbsp_buffer;
unsigned int rbsp_buffer_size;
/** /**
* Used to parse AVC variant of h264 * Used to parse AVC variant of h264
@ -757,7 +759,7 @@ int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length);
* or a decode rbsp tailing? * or a decode rbsp tailing?
* @return decoded bytes, might be src+1 if no escapes * @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); int *dst_length, int *consumed, int length);
/** /**

View File

@ -226,7 +226,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
} }
break; break;
} }
ptr = ff_h264_decode_nal(h, buf, &dst_length, &consumed, src_length); ptr = ff_h264_decode_nal(h, sl, buf, &dst_length, &consumed, src_length);
if (!ptr || dst_length < 0) if (!ptr || dst_length < 0)
break; break;

View File

@ -535,9 +535,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst,
return ret; return ret;
} }
h->rbsp_buffer = NULL;
h->rbsp_buffer_size = 0;
h->thread_context[0] = h; h->thread_context[0] = h;
h->context_initialized = 1; h->context_initialized = 1;