Commit 6c41eda1 authored by Clément Bœsch's avatar Clément Bœsch

Merge commit 'debca908'

* commit 'debca908':
  h264: store {curr,max}_pic_num in the per-slice context
Merged-by: 's avatarClément Bœsch <u@pkh.me>
parents 87d1f820 debca908
...@@ -465,6 +465,8 @@ typedef struct H264SliceContext { ...@@ -465,6 +465,8 @@ typedef struct H264SliceContext {
int poc_lsb; int poc_lsb;
int delta_poc_bottom; int delta_poc_bottom;
int delta_poc[2]; int delta_poc[2];
int curr_pic_num;
int max_pic_num;
} H264SliceContext; } H264SliceContext;
/** /**
...@@ -588,16 +590,6 @@ typedef struct H264Context { ...@@ -588,16 +590,6 @@ typedef struct H264Context {
H264POCContext poc; H264POCContext poc;
/**
* frame_num for frames or 2 * frame_num + 1 for field pics.
*/
int curr_pic_num;
/**
* max_frame_num or 2 * max_frame_num for field pics.
*/
int max_pic_num;
H264Ref default_ref[2]; H264Ref default_ref[2];
H264Picture *short_ref[32]; H264Picture *short_ref[32];
H264Picture *long_ref[32]; H264Picture *long_ref[32];
......
...@@ -305,7 +305,7 @@ int ff_h264_build_ref_list(H264Context *h, H264SliceContext *sl) ...@@ -305,7 +305,7 @@ int ff_h264_build_ref_list(H264Context *h, H264SliceContext *sl)
h264_initialise_ref_list(h, sl); h264_initialise_ref_list(h, sl);
for (list = 0; list < sl->list_count; list++) { for (list = 0; list < sl->list_count; list++) {
int pred = h->curr_pic_num; int pred = sl->curr_pic_num;
for (index = 0; index < sl->nb_ref_modifications[list]; index++) { for (index = 0; index < sl->nb_ref_modifications[list]; index++) {
unsigned int modification_of_pic_nums_idc = sl->ref_modifications[list][index].op; unsigned int modification_of_pic_nums_idc = sl->ref_modifications[list][index].op;
...@@ -320,7 +320,7 @@ int ff_h264_build_ref_list(H264Context *h, H264SliceContext *sl) ...@@ -320,7 +320,7 @@ int ff_h264_build_ref_list(H264Context *h, H264SliceContext *sl)
const unsigned int abs_diff_pic_num = val + 1; const unsigned int abs_diff_pic_num = val + 1;
int frame_num; int frame_num;
if (abs_diff_pic_num > h->max_pic_num) { if (abs_diff_pic_num > sl->max_pic_num) {
av_log(h->avctx, AV_LOG_ERROR, av_log(h->avctx, AV_LOG_ERROR,
"abs_diff_pic_num overflow\n"); "abs_diff_pic_num overflow\n");
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
...@@ -330,7 +330,7 @@ int ff_h264_build_ref_list(H264Context *h, H264SliceContext *sl) ...@@ -330,7 +330,7 @@ int ff_h264_build_ref_list(H264Context *h, H264SliceContext *sl)
pred -= abs_diff_pic_num; pred -= abs_diff_pic_num;
else else
pred += abs_diff_pic_num; pred += abs_diff_pic_num;
pred &= h->max_pic_num - 1; pred &= sl->max_pic_num - 1;
frame_num = pic_num_extract(h, pred, &pic_structure); frame_num = pic_num_extract(h, pred, &pic_structure);
...@@ -844,8 +844,8 @@ int ff_h264_decode_ref_pic_marking(const H264Context *h, H264SliceContext *sl, ...@@ -844,8 +844,8 @@ int ff_h264_decode_ref_pic_marking(const H264Context *h, H264SliceContext *sl,
mmco[i].opcode = opcode; mmco[i].opcode = opcode;
if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) { if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) {
mmco[i].short_pic_num = mmco[i].short_pic_num =
(h->curr_pic_num - get_ue_golomb_long(gb) - 1) & (sl->curr_pic_num - get_ue_golomb_long(gb) - 1) &
(h->max_pic_num - 1); (sl->max_pic_num - 1);
#if 0 #if 0
if (mmco[i].short_pic_num >= h->short_ref_count || if (mmco[i].short_pic_num >= h->short_ref_count ||
!h->short_ref[mmco[i].short_pic_num]) { !h->short_ref[mmco[i].short_pic_num]) {
......
...@@ -418,9 +418,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst, ...@@ -418,9 +418,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst,
memcpy(&h->poc, &h1->poc, sizeof(h->poc)); memcpy(&h->poc, &h1->poc, sizeof(h->poc));
h->curr_pic_num = h1->curr_pic_num;
h->max_pic_num = h1->max_pic_num;
memcpy(h->default_ref, h1->default_ref, sizeof(h->default_ref)); memcpy(h->default_ref, h1->default_ref, sizeof(h->default_ref));
memcpy(h->short_ref, h1->short_ref, sizeof(h->short_ref)); memcpy(h->short_ref, h1->short_ref, sizeof(h->short_ref));
memcpy(h->long_ref, h1->long_ref, sizeof(h->long_ref)); memcpy(h->long_ref, h1->long_ref, sizeof(h->long_ref));
...@@ -1337,7 +1334,7 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl, ...@@ -1337,7 +1334,7 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl,
return 0; return 0;
} }
static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl, static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
const H2645NAL *nal) const H2645NAL *nal)
{ {
const SPS *sps; const SPS *sps;
...@@ -1426,11 +1423,11 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl, ...@@ -1426,11 +1423,11 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl,
sl->mb_field_decoding_flag = picture_structure != PICT_FRAME; sl->mb_field_decoding_flag = picture_structure != PICT_FRAME;
if (picture_structure == PICT_FRAME) { if (picture_structure == PICT_FRAME) {
h->curr_pic_num = sl->frame_num; sl->curr_pic_num = sl->frame_num;
h->max_pic_num = 1 << sps->log2_max_frame_num; sl->max_pic_num = 1 << sps->log2_max_frame_num;
} else { } else {
h->curr_pic_num = 2 * sl->frame_num + 1; sl->curr_pic_num = 2 * sl->frame_num + 1;
h->max_pic_num = 1 << (sps->log2_max_frame_num + 1); sl->max_pic_num = 1 << (sps->log2_max_frame_num + 1);
} }
if (nal->type == NAL_IDR_SLICE) if (nal->type == NAL_IDR_SLICE)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment