mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: h264: add a pointer for weighted prediction temporary buffer Conflicts: libavcodec/h264.c libavcodec/h264.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
857d7194ca
@ -671,9 +671,9 @@ static av_always_inline void mc_part_weighted(H264Context *h, int n, int square,
|
|||||||
if (list0 && list1) {
|
if (list0 && list1) {
|
||||||
/* don't optimize for luma-only case, since B-frames usually
|
/* don't optimize for luma-only case, since B-frames usually
|
||||||
* use implicit weights => chroma too. */
|
* use implicit weights => chroma too. */
|
||||||
uint8_t *tmp_cb = s->obmc_scratchpad;
|
uint8_t *tmp_cb = h->bipred_scratchpad;
|
||||||
uint8_t *tmp_cr = s->obmc_scratchpad + (16 << pixel_shift);
|
uint8_t *tmp_cr = h->bipred_scratchpad + (16 << pixel_shift);
|
||||||
uint8_t *tmp_y = s->obmc_scratchpad + 16 * h->mb_uvlinesize;
|
uint8_t *tmp_y = h->bipred_scratchpad + 16 * h->mb_uvlinesize;
|
||||||
int refn0 = h->ref_cache[0][scan8[n]];
|
int refn0 = h->ref_cache[0][scan8[n]];
|
||||||
int refn1 = h->ref_cache[1][scan8[n]];
|
int refn1 = h->ref_cache[1][scan8[n]];
|
||||||
|
|
||||||
@ -790,7 +790,7 @@ static void free_tables(H264Context *h, int free_rbsp)
|
|||||||
continue;
|
continue;
|
||||||
av_freep(&hx->top_borders[1]);
|
av_freep(&hx->top_borders[1]);
|
||||||
av_freep(&hx->top_borders[0]);
|
av_freep(&hx->top_borders[0]);
|
||||||
av_freep(&hx->s.obmc_scratchpad);
|
av_freep(&hx->bipred_scratchpad);
|
||||||
if (free_rbsp) {
|
if (free_rbsp) {
|
||||||
av_freep(&hx->rbsp_buffer[1]);
|
av_freep(&hx->rbsp_buffer[1]);
|
||||||
av_freep(&hx->rbsp_buffer[0]);
|
av_freep(&hx->rbsp_buffer[0]);
|
||||||
@ -915,8 +915,6 @@ int ff_h264_alloc_tables(H264Context *h)
|
|||||||
h->mb2br_xy[mb_xy] = 8 * (FMO ? mb_xy : (mb_xy % (2 * s->mb_stride)));
|
h->mb2br_xy[mb_xy] = 8 * (FMO ? mb_xy : (mb_xy % (2 * s->mb_stride)));
|
||||||
}
|
}
|
||||||
|
|
||||||
s->obmc_scratchpad = NULL;
|
|
||||||
|
|
||||||
if (!h->dequant4_coeff[0])
|
if (!h->dequant4_coeff[0])
|
||||||
init_dequant_tables(h);
|
init_dequant_tables(h);
|
||||||
|
|
||||||
@ -944,7 +942,7 @@ static void clone_tables(H264Context *dst, H264Context *src, int i)
|
|||||||
dst->mvd_table[1] = src->mvd_table[1] + i * 8 * 2 * s->mb_stride;
|
dst->mvd_table[1] = src->mvd_table[1] + i * 8 * 2 * s->mb_stride;
|
||||||
dst->direct_table = src->direct_table;
|
dst->direct_table = src->direct_table;
|
||||||
dst->list_counts = src->list_counts;
|
dst->list_counts = src->list_counts;
|
||||||
dst->s.obmc_scratchpad = NULL;
|
dst->bipred_scratchpad = NULL;
|
||||||
ff_h264_pred_init(&dst->hpc, src->s.codec_id, src->sps.bit_depth_luma,
|
ff_h264_pred_init(&dst->hpc, src->s.codec_id, src->sps.bit_depth_luma,
|
||||||
src->sps.chroma_format_idc);
|
src->sps.chroma_format_idc);
|
||||||
}
|
}
|
||||||
@ -1214,15 +1212,13 @@ static int decode_update_thread_context(AVCodecContext *dst,
|
|||||||
}
|
}
|
||||||
context_init(h);
|
context_init(h);
|
||||||
|
|
||||||
/* frame_start may not be called for the next thread (if it's decoding
|
|
||||||
* a bottom field) so this has to be allocated here */
|
|
||||||
h->s.obmc_scratchpad = av_malloc(16 * 6 * s->linesize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
h->rbsp_buffer[i] = NULL;
|
h->rbsp_buffer[i] = NULL;
|
||||||
h->rbsp_buffer_size[i] = 0;
|
h->rbsp_buffer_size[i] = 0;
|
||||||
}
|
}
|
||||||
|
h->bipred_scratchpad = NULL;
|
||||||
|
|
||||||
h->thread_context[0] = h;
|
h->thread_context[0] = h;
|
||||||
|
|
||||||
@ -1230,6 +1226,11 @@ static int decode_update_thread_context(AVCodecContext *dst,
|
|||||||
s->dsp.clear_blocks(h->mb + (24 * 16 << h->pixel_shift));
|
s->dsp.clear_blocks(h->mb + (24 * 16 << h->pixel_shift));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* frame_start may not be called for the next thread (if it's decoding
|
||||||
|
* a bottom field) so this has to be allocated here */
|
||||||
|
if (!h->bipred_scratchpad)
|
||||||
|
h->bipred_scratchpad = av_malloc(16 * 6 * s->linesize);
|
||||||
|
|
||||||
// extradata/NAL handling
|
// extradata/NAL handling
|
||||||
h->is_avc = h1->is_avc;
|
h->is_avc = h1->is_avc;
|
||||||
|
|
||||||
@ -1321,8 +1322,8 @@ int ff_h264_frame_start(H264Context *h)
|
|||||||
/* can't be in alloc_tables because linesize isn't known there.
|
/* can't be in alloc_tables because linesize isn't known there.
|
||||||
* FIXME: redo bipred weight to not require extra buffer? */
|
* FIXME: redo bipred weight to not require extra buffer? */
|
||||||
for (i = 0; i < s->slice_context_count; i++)
|
for (i = 0; i < s->slice_context_count; i++)
|
||||||
if (h->thread_context[i] && !h->thread_context[i]->s.obmc_scratchpad)
|
if (h->thread_context[i] && !h->thread_context[i]->bipred_scratchpad)
|
||||||
h->thread_context[i]->s.obmc_scratchpad = av_malloc(16 * 6 * s->linesize);
|
h->thread_context[i]->bipred_scratchpad = av_malloc(16 * 6 * s->linesize);
|
||||||
|
|
||||||
/* Some macroblocks can be accessed before they're available in case
|
/* Some macroblocks can be accessed before they're available in case
|
||||||
* of lost slices, MBAFF or threading. */
|
* of lost slices, MBAFF or threading. */
|
||||||
@ -2642,6 +2643,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
|
|||||||
"Could not allocate memory for h264\n");
|
"Could not allocate memory for h264\n");
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
}
|
}
|
||||||
|
h->bipred_scratchpad = NULL;
|
||||||
|
|
||||||
if (!HAVE_THREADS || !(s->avctx->active_thread_type & FF_THREAD_SLICE)) {
|
if (!HAVE_THREADS || !(s->avctx->active_thread_type & FF_THREAD_SLICE)) {
|
||||||
if (context_init(h) < 0) {
|
if (context_init(h) < 0) {
|
||||||
|
@ -595,6 +595,7 @@ typedef struct H264Context {
|
|||||||
int initial_cpb_removal_delay[32]; ///< Initial timestamps for CPBs
|
int initial_cpb_removal_delay[32]; ///< Initial timestamps for CPBs
|
||||||
|
|
||||||
int cur_chroma_format_idc;
|
int cur_chroma_format_idc;
|
||||||
|
uint8_t *bipred_scratchpad;
|
||||||
|
|
||||||
int16_t slice_row[MAX_SLICES]; ///< to detect when MAX_SLICES is too low
|
int16_t slice_row[MAX_SLICES]; ///< to detect when MAX_SLICES is too low
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user