mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
h264: pass a H2645NAL to slice header decoding
Replace the decoder-global nal_unit_type/nal_ref_idc variables with the per-NAL ones. The decoder-global ones still cannot be removed because they are used by hwaccels.
This commit is contained in:
parent
523c4c5b70
commit
b25cd7540e
@ -851,7 +851,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
|
||||
case NAL_SLICE:
|
||||
sl->gb = nal->gb;
|
||||
|
||||
if ((err = ff_h264_decode_slice_header(h, sl)))
|
||||
if ((err = ff_h264_decode_slice_header(h, sl, nal)))
|
||||
break;
|
||||
|
||||
if (h->sei.recovery_point.recovery_frame_cnt >= 0 && h->recovery_frame < 0) {
|
||||
|
@ -929,7 +929,8 @@ int ff_h264_slice_context_init(H264Context *h, H264SliceContext *sl);
|
||||
|
||||
void ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl, int y, int height);
|
||||
|
||||
int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl);
|
||||
int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl,
|
||||
const H2645NAL *nal);
|
||||
int ff_h264_execute_decode_slices(H264Context *h, unsigned context_count);
|
||||
int ff_h264_update_thread_context(AVCodecContext *dst,
|
||||
const AVCodecContext *src);
|
||||
|
@ -988,7 +988,8 @@ static int h264_init_ps(H264Context *h, const H264SliceContext *sl)
|
||||
* slice in a field (or a frame). It decides whether we are decoding a new frame
|
||||
* or a second field in a pair and does the necessary setup.
|
||||
*/
|
||||
static int h264_field_start(H264Context *h, const H264SliceContext *sl)
|
||||
static int h264_field_start(H264Context *h, const H264SliceContext *sl,
|
||||
const H2645NAL *nal)
|
||||
{
|
||||
const SPS *sps;
|
||||
|
||||
@ -1002,7 +1003,7 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl)
|
||||
|
||||
last_pic_droppable = h->droppable;
|
||||
last_pic_structure = h->picture_structure;
|
||||
h->droppable = (h->nal_ref_idc == 0);
|
||||
h->droppable = (nal->ref_idc == 0);
|
||||
h->picture_structure = sl->picture_structure;
|
||||
|
||||
/* Shorten frame num gaps so we don't have to allocate reference
|
||||
@ -1163,7 +1164,8 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
|
||||
static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl,
|
||||
const H2645NAL *nal)
|
||||
{
|
||||
const SPS *sps;
|
||||
const PPS *pps;
|
||||
@ -1207,7 +1209,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
|
||||
sl->slice_type = slice_type;
|
||||
sl->slice_type_nos = slice_type & 3;
|
||||
|
||||
if (h->nal_unit_type == NAL_IDR_SLICE &&
|
||||
if (nal->type == NAL_IDR_SLICE &&
|
||||
sl->slice_type_nos != AV_PICTURE_TYPE_I) {
|
||||
av_log(h->avctx, AV_LOG_ERROR, "A non-intra slice in an IDR NAL unit.\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
@ -1244,7 +1246,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
|
||||
|
||||
sl->mb_mbaff = 0;
|
||||
|
||||
droppable = h->nal_ref_idc == 0;
|
||||
droppable = nal->ref_idc == 0;
|
||||
if (sps->frame_mbs_only_flag) {
|
||||
picture_structure = PICT_FRAME;
|
||||
} else {
|
||||
@ -1286,7 +1288,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
|
||||
h->max_pic_num = 1 << (sps->log2_max_frame_num + 1);
|
||||
}
|
||||
|
||||
if (h->nal_unit_type == NAL_IDR_SLICE)
|
||||
if (nal->type == NAL_IDR_SLICE)
|
||||
get_ue_golomb(&sl->gb); /* idr_pic_id */
|
||||
|
||||
if (sps->poc_type == 0) {
|
||||
@ -1348,7 +1350,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
|
||||
sl->slice_type_nos, &sl->pwt);
|
||||
|
||||
sl->explicit_ref_marking = 0;
|
||||
if (h->nal_ref_idc) {
|
||||
if (nal->ref_idc) {
|
||||
ret = ff_h264_decode_ref_pic_marking(h, sl, &sl->gb);
|
||||
if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
|
||||
return AVERROR_INVALIDDATA;
|
||||
@ -1419,16 +1421,17 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
|
||||
*
|
||||
* @return 0 if okay, <0 if an error occurred
|
||||
*/
|
||||
int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
|
||||
int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl,
|
||||
const H2645NAL *nal)
|
||||
{
|
||||
int i, j, ret = 0;
|
||||
|
||||
ret = h264_slice_header_parse(h, sl);
|
||||
ret = h264_slice_header_parse(h, sl, nal);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (h->current_slice == 0) {
|
||||
ret = h264_field_start(h, sl);
|
||||
ret = h264_field_start(h, sl, nal);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
@ -1448,7 +1451,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
|
||||
|
||||
if (!h->setup_finished) {
|
||||
ff_h264_init_poc(h->cur_pic_ptr->field_poc, &h->cur_pic_ptr->poc,
|
||||
h->ps.sps, &h->poc, h->picture_structure, h->nal_ref_idc);
|
||||
h->ps.sps, &h->poc, h->picture_structure, nal->ref_idc);
|
||||
|
||||
memcpy(h->mmco, sl->mmco, sl->nb_mmco * sizeof(*h->mmco));
|
||||
h->nb_mmco = sl->nb_mmco;
|
||||
@ -1478,7 +1481,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
|
||||
(h->avctx->skip_loop_filter >= AVDISCARD_BIDIR &&
|
||||
sl->slice_type_nos == AV_PICTURE_TYPE_B) ||
|
||||
(h->avctx->skip_loop_filter >= AVDISCARD_NONREF &&
|
||||
h->nal_ref_idc == 0))
|
||||
nal->ref_idc == 0))
|
||||
sl->deblocking_filter = 0;
|
||||
|
||||
if (sl->deblocking_filter == 1 && h->nb_slice_ctx > 1) {
|
||||
@ -1544,7 +1547,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
|
||||
sl->mb_y * h->mb_width + sl->mb_x,
|
||||
av_get_picture_type_char(sl->slice_type),
|
||||
sl->slice_type_fixed ? " fix" : "",
|
||||
h->nal_unit_type == NAL_IDR_SLICE ? " IDR" : "",
|
||||
nal->type == NAL_IDR_SLICE ? " IDR" : "",
|
||||
h->poc.frame_num,
|
||||
h->cur_pic_ptr->field_poc[0],
|
||||
h->cur_pic_ptr->field_poc[1],
|
||||
|
Loading…
Reference in New Issue
Block a user