Skip to content

Commit

Permalink
[Encode] Fix header pack in driver
Browse files Browse the repository at this point in the history
Pack dummy header in driver
  • Loading branch information
leyu-yao authored and intel-mediadev committed Aug 29, 2023
1 parent eee6b1e commit bc0da6b
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 162 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,7 @@ VAStatus DdiEncodeVp9::EncodeInCodecHal(uint32_t numSlices)
vp9PicParam->BitOffsetForLFRefDelta = picBitOffset.bit_offset_ref_lf_delta;
vp9PicParam->BitOffsetForLFModeDelta = picBitOffset.bit_offset_mode_lf_delta;
vp9PicParam->BitOffsetForSegmentation = picBitOffset.bit_offset_segmentation;
vp9PicParam->BitSizeForSegmentation = picBitOffset.bit_size_segmentation;

m_encodeCtx->ppNALUnitParams[0]->uiNalUnitType = 0x22;
m_encodeCtx->ppNALUnitParams[0]->bInsertEmulationBytes = false;
Expand Down
86 changes: 5 additions & 81 deletions media_driver/linux/common/codec/ddi/media_libvpx_vp9.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -429,91 +429,15 @@ bool Vp9WriteUncompressHeader(struct _DDI_ENCODE_CONTEXT *ddiEncContext,
vp9_wb_write_bit(wb, 0);
}

headerBitoffset->bit_offset_segmentation = wb->bit_offset;
vp9_wb_write_bit(wb, picParam->PicFlags.fields.segmentation_enabled);
if (picParam->PicFlags.fields.segmentation_enabled)
{
int i;

#define VP9_MAX_PROB 255
vp9_wb_write_bit(wb, picParam->PicFlags.fields.segmentation_update_map);
headerBitoffset->bit_offset_segmentation = wb->bit_offset;
if (picParam->PicFlags.fields.segmentation_update_map)
{
/* write the seg_tree_probs */
/* segment_tree_probs/segment_pred_probs are not passed.
* So the hard-coded prob is writen
*/
for (i = 0; i < 7; i++)
{
vp9_wb_write_bit(wb, 1);
vp9_wb_write_literal(wb, VP9_MAX_PROB, 8);
}

vp9_wb_write_bit(wb, picParam->PicFlags.fields.segmentation_temporal_update);
if (picParam->PicFlags.fields.segmentation_temporal_update)
{
for (i = 0; i < 3; i++)
{
vp9_wb_write_bit(wb, 1);
vp9_wb_write_literal(wb, VP9_MAX_PROB, 8);
}
}
}

/* write the segment_data info */
vp9_wb_write_bit(wb, picParam->PicFlags.fields.seg_update_data);
if (picParam->PicFlags.fields.seg_update_data)
{
CODEC_VP9_ENCODE_SEG_PARAMS *seg_data;
int seg_delta;

/* abs_delta should be zero */
vp9_wb_write_bit(wb, 0);
for (i = 0; i < 8; i++)
{
seg_data = &segParams->SegData[i];

/* The segment qindex delta */
/* This check is skipped */
/* if (seg_data->SegmentQIndexDelta != 0) */
if (1)
{
vp9_wb_write_bit(wb, 1);
seg_delta = seg_data->SegmentQIndexDelta;
vp9_wb_write_literal(wb, abs(seg_delta), 8);
vp9_wb_write_bit(wb, seg_delta < 0);
}
else
{
vp9_wb_write_bit(wb, 0);
}

/* The segment lf delta */
/* if (seg_data->SegmentLFLevelDelta != 0) */
if (1)
{
vp9_wb_write_bit(wb, 1);
seg_delta = seg_data->SegmentLFLevelDelta;
vp9_wb_write_literal(wb, abs(seg_delta), 6);
vp9_wb_write_bit(wb, seg_delta < 0);
}
else
{
vp9_wb_write_bit(wb, 0);
}

/* segment reference flag */
vp9_wb_write_bit(wb, seg_data->SegmentFlags.fields.SegmentReferenceEnabled);
if (seg_data->SegmentFlags.fields.SegmentReferenceEnabled)
{
vp9_wb_write_literal(wb, seg_data->SegmentFlags.fields.SegmentReference, 2);
}

/* segment skip flag */
vp9_wb_write_bit(wb, seg_data->SegmentFlags.fields.SegmentSkipped);
}
}
// Segmentation syntax will be filled by HW, need leave dummy here.
vp9_wb_write_bit(wb, 0);
vp9_wb_write_bit(wb, 0);
}
headerBitoffset->bit_size_segmentation = wb->bit_offset - headerBitoffset->bit_offset_segmentation;

/* write tile info */
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,7 @@ VAStatus DdiEncodeVp9::EncodeInCodecHal(uint32_t numSlices)
vp9PicParam->BitOffsetForLFRefDelta = picBitOffset.bit_offset_ref_lf_delta;
vp9PicParam->BitOffsetForLFModeDelta = picBitOffset.bit_offset_mode_lf_delta;
vp9PicParam->BitOffsetForSegmentation = picBitOffset.bit_offset_segmentation;
vp9PicParam->BitSizeForSegmentation = picBitOffset.bit_size_segmentation;

m_encodeCtx->ppNALUnitParams[0]->uiNalUnitType = 0x22;
m_encodeCtx->ppNALUnitParams[0]->bInsertEmulationBytes = false;
Expand Down
86 changes: 5 additions & 81 deletions media_softlet/linux/common/codec/ddi/enc/media_libvpx_vp9_next.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -429,91 +429,15 @@ bool Vp9WriteUncompressHeader(encode::DDI_ENCODE_CONTEXT *ddiEncContext,
vp9_wb_write_bit(wb, 0);
}

headerBitoffset->bit_offset_segmentation = wb->bit_offset;
vp9_wb_write_bit(wb, picParam->PicFlags.fields.segmentation_enabled);
if (picParam->PicFlags.fields.segmentation_enabled)
{
int i;

#define VP9_MAX_PROB 255
vp9_wb_write_bit(wb, picParam->PicFlags.fields.segmentation_update_map);
headerBitoffset->bit_offset_segmentation = wb->bit_offset;
if (picParam->PicFlags.fields.segmentation_update_map)
{
/* write the seg_tree_probs */
/* segment_tree_probs/segment_pred_probs are not passed.
* So the hard-coded prob is writen
*/
for (i = 0; i < 7; i++)
{
vp9_wb_write_bit(wb, 1);
vp9_wb_write_literal(wb, VP9_MAX_PROB, 8);
}

vp9_wb_write_bit(wb, picParam->PicFlags.fields.segmentation_temporal_update);
if (picParam->PicFlags.fields.segmentation_temporal_update)
{
for (i = 0; i < 3; i++)
{
vp9_wb_write_bit(wb, 1);
vp9_wb_write_literal(wb, VP9_MAX_PROB, 8);
}
}
}

/* write the segment_data info */
vp9_wb_write_bit(wb, picParam->PicFlags.fields.seg_update_data);
if (picParam->PicFlags.fields.seg_update_data)
{
CODEC_VP9_ENCODE_SEG_PARAMS *seg_data;
int seg_delta;

/* abs_delta should be zero */
vp9_wb_write_bit(wb, 0);
for (i = 0; i < 8; i++)
{
seg_data = &segParams->SegData[i];

/* The segment qindex delta */
/* This check is skipped */
/* if (seg_data->SegmentQIndexDelta != 0) */
if (1)
{
vp9_wb_write_bit(wb, 1);
seg_delta = seg_data->SegmentQIndexDelta;
vp9_wb_write_literal(wb, abs(seg_delta), 8);
vp9_wb_write_bit(wb, seg_delta < 0);
}
else
{
vp9_wb_write_bit(wb, 0);
}

/* The segment lf delta */
/* if (seg_data->SegmentLFLevelDelta != 0) */
if (1)
{
vp9_wb_write_bit(wb, 1);
seg_delta = seg_data->SegmentLFLevelDelta;
vp9_wb_write_literal(wb, abs(seg_delta), 6);
vp9_wb_write_bit(wb, seg_delta < 0);
}
else
{
vp9_wb_write_bit(wb, 0);
}

/* segment reference flag */
vp9_wb_write_bit(wb, seg_data->SegmentFlags.fields.SegmentReferenceEnabled);
if (seg_data->SegmentFlags.fields.SegmentReferenceEnabled)
{
vp9_wb_write_literal(wb, seg_data->SegmentFlags.fields.SegmentReference, 2);
}

/* segment skip flag */
vp9_wb_write_bit(wb, seg_data->SegmentFlags.fields.SegmentSkipped);
}
}
// Segmentation syntax will be filled by HW, need leave dummy here.
vp9_wb_write_bit(wb, 0);
vp9_wb_write_bit(wb, 0);
}
headerBitoffset->bit_size_segmentation = wb->bit_offset - headerBitoffset->bit_offset_segmentation;

/* write tile info */
{
Expand Down

0 comments on commit bc0da6b

Please sign in to comment.