Skip to content

Commit f6c643f

Browse files
author
titus
committed
+ H.264 PolyV changes
1 parent 48c0dba commit f6c643f

5 files changed

Lines changed: 84 additions & 58 deletions

File tree

libavcodec/h264_ps.c

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -301,20 +301,26 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,
301301
}
302302
memcpy(sps->data, gb->buffer, sps->data_size);
303303

304+
sps->b_mars_flag = 1; // [PolyV] always active
305+
304306
// Re-add the removed stop bit (may be used by hwaccels).
305307
if (!(gb->size_in_bits & 7) && sps->data_size < sizeof(sps->data))
306308
sps->data[sps->data_size++] = 0x80;
307309

308310
profile_idc = get_bits(gb, 8);
311+
309312
constraint_set_flags |= get_bits1(gb) << 0; // constraint_set0_flag
310313
constraint_set_flags |= get_bits1(gb) << 1; // constraint_set1_flag
311314
constraint_set_flags |= get_bits1(gb) << 2; // constraint_set2_flag
312315
constraint_set_flags |= get_bits1(gb) << 3; // constraint_set3_flag
313-
constraint_set_flags |= get_bits1(gb) << 4; // constraint_set4_flag
314-
constraint_set_flags |= get_bits1(gb) << 5; // constraint_set5_flag
316+
317+
skip_bits(gb, 2); // [PolyV] ignore constraint_set4_flag and constraint_set5_flag
318+
319+
sps_id = get_ue_golomb_31(gb); // [PolyV] Moved
320+
315321
skip_bits(gb, 2); // reserved_zero_2bits
322+
316323
level_idc = get_bits(gb, 8);
317-
sps_id = get_ue_golomb_31(gb);
318324

319325
if (sps_id >= MAX_SPS_COUNT) {
320326
av_log(avctx, AV_LOG_ERROR, "sps_id %u out of range\n", sps_id);
@@ -356,8 +362,8 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,
356362
goto fail;
357363
}
358364
}
359-
sps->bit_depth_luma = get_ue_golomb_31(gb) + 8;
360365
sps->bit_depth_chroma = get_ue_golomb_31(gb) + 8;
366+
sps->bit_depth_luma = get_ue_golomb_31(gb) + 8; // [PolyV] Moved
361367
if (sps->bit_depth_chroma != sps->bit_depth_luma) {
362368
avpriv_request_sample(avctx,
363369
"Different chroma and luma bit depth");
@@ -369,7 +375,7 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,
369375
sps->bit_depth_luma, sps->bit_depth_chroma);
370376
goto fail;
371377
}
372-
sps->transform_bypass = get_bits1(gb);
378+
sps->transform_bypass = get_bits1(gb) != 1;
373379
ret = decode_scaling_matrices(gb, sps, NULL, 1, get_bits1(gb),
374380
&sps->scaling_matrix_present_mask,
375381
sps->scaling_matrix4, sps->scaling_matrix8);
@@ -383,14 +389,13 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,
383389
}
384390

385391
log2_max_frame_num_minus4 = get_ue_golomb_31(gb);
386-
if (log2_max_frame_num_minus4 < MIN_LOG2_MAX_FRAME_NUM - 4 ||
387-
log2_max_frame_num_minus4 > MAX_LOG2_MAX_FRAME_NUM - 4) {
392+
if (log2_max_frame_num_minus4 - 4 > 12) {
388393
av_log(avctx, AV_LOG_ERROR,
389394
"log2_max_frame_num_minus4 out of range (0-12): %d\n",
390395
log2_max_frame_num_minus4);
391396
goto fail;
392397
}
393-
sps->log2_max_frame_num = log2_max_frame_num_minus4 + 4;
398+
sps->log2_max_frame_num = log2_max_frame_num_minus4; // [PolyV] Removed +4
394399

395400
sps->poc_type = get_ue_golomb_31(gb);
396401

@@ -436,19 +441,22 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,
436441
goto fail;
437442
}
438443

439-
sps->ref_frame_count = get_ue_golomb_31(gb);
444+
sps->ref_frame_count = get_ue_golomb_31(gb) + 4; // [PolyV] Added +4
440445
if (avctx->codec_tag == MKTAG('S', 'M', 'V', '2'))
441446
sps->ref_frame_count = FFMAX(2, sps->ref_frame_count);
442447
if (sps->ref_frame_count > H264_MAX_DPB_FRAMES) {
443448
av_log(avctx, AV_LOG_ERROR,
444449
"too many reference frames %d\n", sps->ref_frame_count);
445450
goto fail;
446451
}
447-
sps->gaps_in_frame_num_allowed_flag = get_bits1(gb);
448-
sps->mb_width = get_ue_golomb(gb) + 1;
449-
sps->mb_height = get_ue_golomb(gb) + 1;
450452

451-
sps->frame_mbs_only_flag = get_bits1(gb);
453+
sps->mb_height = get_ue_golomb(gb) + 1; // [PolyV] Moved
454+
sps->mb_width = get_ue_golomb(gb); // [PolyV] Removed +1
455+
456+
sps->direct_8x8_inference_flag = get_bits1(gb); // [PolyV] Moved
457+
sps->gaps_in_frame_num_allowed_flag = get_bits1(gb) != 1; // [PolyV] Moved, inverted
458+
459+
sps->frame_mbs_only_flag = get_bits1(gb) != 1; // [PolyV] Moved, inverted
452460

453461
if (sps->mb_height >= INT_MAX / 2U) {
454462
av_log(avctx, AV_LOG_ERROR, "height overflow\n");
@@ -469,14 +477,12 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,
469477
goto fail;
470478
}
471479

472-
sps->direct_8x8_inference_flag = get_bits1(gb);
473-
474480
sps->crop = get_bits1(gb);
475481
if (sps->crop) {
482+
unsigned int crop_top = get_ue_golomb(gb); // [PolyV] Moved
483+
unsigned int crop_bottom = get_ue_golomb(gb); // [PolyV] Moved
476484
unsigned int crop_left = get_ue_golomb(gb);
477485
unsigned int crop_right = get_ue_golomb(gb);
478-
unsigned int crop_top = get_ue_golomb(gb);
479-
unsigned int crop_bottom = get_ue_golomb(gb);
480486
int width = 16 * sps->mb_width;
481487
int height = 16 * sps->mb_height;
482488

@@ -750,8 +756,6 @@ int ff_h264_decode_picture_parameter_set(GetBitContext *gb, AVCodecContext *avct
750756
goto fail;
751757
}
752758

753-
pps->cabac = get_bits1(gb);
754-
pps->pic_order_present = get_bits1(gb);
755759
pps->slice_group_count = get_ue_golomb(gb) + 1;
756760
if (pps->slice_group_count > 1) {
757761
pps->mb_slice_group_map_type = get_ue_golomb(gb);
@@ -767,10 +771,18 @@ int ff_h264_decode_picture_parameter_set(GetBitContext *gb, AVCodecContext *avct
767771
goto fail;
768772
}
769773

774+
pps->cabac = get_bits1(gb); // [PolyV] Moved
775+
pps->pic_order_present = get_bits1(gb); // [PolyV] Moved
776+
770777
qp_bd_offset = 6 * (sps->bit_depth_luma - 8);
771778

772779
pps->weighted_pred = get_bits1(gb);
773780
pps->weighted_bipred_idc = get_bits(gb, 2);
781+
782+
pps->deblocking_filter_parameters_present = get_bits1(gb); // [PolyV] Moved
783+
pps->constrained_intra_pred = get_bits1(gb); // [PolyV] Moved
784+
pps->redundant_pic_cnt_present = get_bits1(gb); // [PolyV] Moved
785+
774786
pps->init_qp = get_se_golomb(gb) + 26U + qp_bd_offset;
775787
pps->init_qs = get_se_golomb(gb) + 26U + qp_bd_offset;
776788
pps->chroma_qp_index_offset[0] = get_se_golomb(gb);
@@ -779,9 +791,7 @@ int ff_h264_decode_picture_parameter_set(GetBitContext *gb, AVCodecContext *avct
779791
goto fail;
780792
}
781793

782-
pps->deblocking_filter_parameters_present = get_bits1(gb);
783-
pps->constrained_intra_pred = get_bits1(gb);
784-
pps->redundant_pic_cnt_present = get_bits1(gb);
794+
get_ue_golomb(gb); // [PolyV] Random read
785795

786796
pps->transform_8x8_mode = 0;
787797
memcpy(pps->scaling_matrix4, sps->scaling_matrix4,
@@ -792,13 +802,21 @@ int ff_h264_decode_picture_parameter_set(GetBitContext *gb, AVCodecContext *avct
792802
bits_left = bit_length - get_bits_count(gb);
793803
if (bits_left > 0 && more_rbsp_data_in_pps(sps, avctx)) {
794804
pps->transform_8x8_mode = get_bits1(gb);
795-
pps->pic_scaling_matrix_present_flag = get_bits1(gb);
805+
//pps->pic_scaling_matrix_present_flag = get_bits1(gb); // [PolyV] ignored
806+
807+
if (sps->b_mars_flag == 1) // [PolyV] added
808+
get_bits(gb, 2);
809+
796810
ret = decode_scaling_matrices(gb, sps, pps, 0,
797811
pps->pic_scaling_matrix_present_flag,
798812
&pps->pic_scaling_matrix_present_mask,
799813
pps->scaling_matrix4, pps->scaling_matrix8);
800814
if (ret < 0)
801815
goto fail;
816+
817+
if (sps->b_mars_flag == 1) // [PolyV] added
818+
get_se_golomb(gb);
819+
802820
// second_chroma_qp_index_offset
803821
pps->chroma_qp_index_offset[1] = get_se_golomb(gb);
804822
if (pps->chroma_qp_index_offset[1] < -12 || pps->chroma_qp_index_offset[1] > 12) {

libavcodec/h264_ps.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ typedef struct SPS {
4545
unsigned int sps_id;
4646
int profile_idc;
4747
int level_idc;
48+
int b_mars_flag; //< PolyV
4849
int chroma_format_idc;
4950
int transform_bypass; ///< qpprime_y_zero_transform_bypass_flag
5051
int log2_max_frame_num; ///< log2_max_frame_num_minus4 + 4

libavcodec/h264_refs.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,7 @@ int ff_h264_execute_ref_pic_marking(H264Context *h)
825825
}
826826

827827
int ff_h264_decode_ref_pic_marking(H264SliceContext *sl, GetBitContext *gb,
828-
const H2645NAL *nal, void *logctx)
828+
const H2645NAL *nal, void *logctx, int read_extra)
829829
{
830830
MMCO *mmco = sl->mmco;
831831
int nb_mmco = 0;
@@ -841,6 +841,8 @@ int ff_h264_decode_ref_pic_marking(H264SliceContext *sl, GetBitContext *gb,
841841
} else {
842842
sl->explicit_ref_marking = get_bits1(gb);
843843
if (sl->explicit_ref_marking) {
844+
if (read_extra)
845+
get_ue_golomb_31(gb);
844846
int i;
845847
for (i = 0; i < FF_ARRAY_ELEMS(sl->mmco); i++) {
846848
MMCOOpcode opcode = get_ue_golomb_31(gb);

libavcodec/h264_slice.c

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,17 +1745,14 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
17451745
pps = h->ps.pps_list[sl->pps_id];
17461746
sps = pps->sps;
17471747

1748-
sl->frame_num = get_bits(&sl->gb, sps->log2_max_frame_num);
1749-
if (!first_slice) {
1750-
if (h->poc.frame_num != sl->frame_num) {
1751-
av_log(h->avctx, AV_LOG_ERROR, "Frame num change from %d to %d\n",
1752-
h->poc.frame_num, sl->frame_num);
1753-
return AVERROR_INVALIDDATA;
1754-
}
1748+
if (nal->type == H264_NAL_IDR_SLICE) {
1749+
unsigned idr_pic_id = get_ue_golomb_long(&sl->gb); // [PolyV] Moved
1750+
if (idr_pic_id < 65536) {
1751+
sl->idr_pic_id = idr_pic_id;
1752+
} else
1753+
av_log(h->avctx, AV_LOG_WARNING, "idr_pic_id is invalid\n");
17551754
}
17561755

1757-
sl->mb_mbaff = 0;
1758-
17591756
if (sps->frame_mbs_only_flag) {
17601757
picture_structure = PICT_FRAME;
17611758
} else {
@@ -1771,6 +1768,21 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
17711768
picture_structure = PICT_FRAME;
17721769
}
17731770
}
1771+
1772+
sl->frame_num = get_bits(&sl->gb, sps->log2_max_frame_num); // [PolyV] Moved
1773+
if (!first_slice) {
1774+
if (h->poc.frame_num != sl->frame_num) {
1775+
av_log(h->avctx, AV_LOG_ERROR, "Frame num change from %d to %d\n",
1776+
h->poc.frame_num, sl->frame_num);
1777+
return AVERROR_INVALIDDATA;
1778+
}
1779+
}
1780+
1781+
sl->redundant_pic_count = 0;
1782+
if (pps->redundant_pic_cnt_present)
1783+
sl->redundant_pic_count = get_ue_golomb(&sl->gb); // [PolyV] Moved
1784+
1785+
sl->mb_mbaff = 0;
17741786
sl->picture_structure = picture_structure;
17751787
sl->mb_field_decoding_flag = picture_structure != PICT_FRAME;
17761788

@@ -1782,21 +1794,13 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
17821794
sl->max_pic_num = 1 << (sps->log2_max_frame_num + 1);
17831795
}
17841796

1785-
if (nal->type == H264_NAL_IDR_SLICE) {
1786-
unsigned idr_pic_id = get_ue_golomb_long(&sl->gb);
1787-
if (idr_pic_id < 65536) {
1788-
sl->idr_pic_id = idr_pic_id;
1789-
} else
1790-
av_log(h->avctx, AV_LOG_WARNING, "idr_pic_id is invalid\n");
1791-
}
1792-
17931797
sl->poc_lsb = 0;
17941798
sl->delta_poc_bottom = 0;
17951799
if (sps->poc_type == 0) {
1796-
sl->poc_lsb = get_bits(&sl->gb, sps->log2_max_poc_lsb);
1797-
1798-
if (pps->pic_order_present == 1 && picture_structure == PICT_FRAME)
1800+
if (pps->pic_order_present == 1 && picture_structure == PICT_FRAME) // [PolyV] Moved
17991801
sl->delta_poc_bottom = get_se_golomb(&sl->gb);
1802+
1803+
sl->poc_lsb = get_bits(&sl->gb, sps->log2_max_poc_lsb);
18001804
}
18011805

18021806
sl->delta_poc[0] = sl->delta_poc[1] = 0;
@@ -1807,10 +1811,6 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
18071811
sl->delta_poc[1] = get_se_golomb(&sl->gb);
18081812
}
18091813

1810-
sl->redundant_pic_count = 0;
1811-
if (pps->redundant_pic_cnt_present)
1812-
sl->redundant_pic_count = get_ue_golomb(&sl->gb);
1813-
18141814
if (sl->slice_type_nos == AV_PICTURE_TYPE_B)
18151815
sl->direct_spatial_mv_pred = get_bits1(&sl->gb);
18161816

@@ -1845,11 +1845,23 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
18451845

18461846
sl->explicit_ref_marking = 0;
18471847
if (nal->ref_idc) {
1848-
ret = ff_h264_decode_ref_pic_marking(sl, &sl->gb, nal, h->avctx);
1848+
ret = ff_h264_decode_ref_pic_marking(sl, &sl->gb, nal, h->avctx, 1);
18491849
if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
18501850
return AVERROR_INVALIDDATA;
18511851
}
18521852

1853+
if (nal->type == 1) {
1854+
get_bits(&sl->gb, 2); // TODO: this seems to fix it, but I don't know why
1855+
}
1856+
1857+
sl->last_qscale_diff = 0;
1858+
tmp = pps->init_qp + (unsigned)get_se_golomb(&sl->gb);
1859+
if (tmp > 51 + 6 * (sps->bit_depth_luma - 8)) {
1860+
av_log(h->avctx, AV_LOG_ERROR, "QP %u out of range (%d)\n", tmp, show_bits_long(&sl->gb, 32)); // TODO: temporary
1861+
return AVERROR_INVALIDDATA;
1862+
}
1863+
sl->qscale = tmp;
1864+
18531865
if (sl->slice_type_nos != AV_PICTURE_TYPE_I && pps->cabac) {
18541866
tmp = get_ue_golomb_31(&sl->gb);
18551867
if (tmp > 2) {
@@ -1859,13 +1871,6 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
18591871
sl->cabac_init_idc = tmp;
18601872
}
18611873

1862-
sl->last_qscale_diff = 0;
1863-
tmp = pps->init_qp + (unsigned)get_se_golomb(&sl->gb);
1864-
if (tmp > 51 + 6 * (sps->bit_depth_luma - 8)) {
1865-
av_log(h->avctx, AV_LOG_ERROR, "QP %u out of range\n", tmp);
1866-
return AVERROR_INVALIDDATA;
1867-
}
1868-
sl->qscale = tmp;
18691874
sl->chroma_qp[0] = get_chroma_qp(pps, 0, sl->qscale);
18701875
sl->chroma_qp[1] = get_chroma_qp(pps, 1, sl->qscale);
18711876
// FIXME qscale / qp ... stuff
@@ -1890,8 +1895,8 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
18901895
sl->deblocking_filter ^= 1; // 1<->0
18911896

18921897
if (sl->deblocking_filter) {
1893-
int slice_alpha_c0_offset_div2 = get_se_golomb(&sl->gb);
18941898
int slice_beta_offset_div2 = get_se_golomb(&sl->gb);
1899+
int slice_alpha_c0_offset_div2 = get_se_golomb(&sl->gb); // [PolyV] Moved
18951900
if (slice_alpha_c0_offset_div2 > 6 ||
18961901
slice_alpha_c0_offset_div2 < -6 ||
18971902
slice_beta_offset_div2 > 6 ||

libavcodec/h264dec.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ void ff_h264_remove_all_refs(H264Context *h);
605605
int ff_h264_execute_ref_pic_marking(H264Context *h);
606606

607607
int ff_h264_decode_ref_pic_marking(H264SliceContext *sl, GetBitContext *gb,
608-
const H2645NAL *nal, void *logctx);
608+
const H2645NAL *nal, void *logctx, int read_extra);
609609

610610
void ff_h264_hl_decode_mb(const H264Context *h, H264SliceContext *sl);
611611
void ff_h264_decode_init_vlc(void);

0 commit comments

Comments
 (0)