From a714fbacf7bc5dcbc316bbfcb6bd9cb38fb4f858 Mon Sep 17 00:00:00 2001 From: Leo Liu Date: Mon, 30 Mar 2015 13:33:19 -0400 Subject: [PATCH] radeon/vce: implement video usability information support MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This will help encoding VUI into the bitstream v2: make backward compatible Signed-off-by: Leo Liu Reviewed-by: Christian König --- src/gallium/drivers/radeon/radeon_vce.c | 5 +++ src/gallium/drivers/radeon/radeon_vce.h | 2 + src/gallium/drivers/radeon/radeon_vce_40_2_2.c | 52 ++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/src/gallium/drivers/radeon/radeon_vce.c b/src/gallium/drivers/radeon/radeon_vce.c index 27a3832..6d34bd3 100644 --- a/src/gallium/drivers/radeon/radeon_vce.c +++ b/src/gallium/drivers/radeon/radeon_vce.c @@ -242,6 +242,8 @@ static void rvce_begin_frame(struct pipe_video_codec *encoder, enc->config_extension(enc); enc->motion_estimation(enc); enc->rdo(enc); + if (enc->use_vui) + enc->vui(enc); enc->pic_control(enc); enc->feedback(enc); flush(enc); @@ -352,6 +354,9 @@ struct pipe_video_codec *rvce_create_encoder(struct pipe_context *context, if (!enc) return NULL; + if ((rscreen->info.drm_major > 2) || (rscreen->info.drm_minor >= 42)) + enc->use_vui = true; + enc->base = *templ; enc->base.context = context; diff --git a/src/gallium/drivers/radeon/radeon_vce.h b/src/gallium/drivers/radeon/radeon_vce.h index 11febc8..7f0cd1f 100644 --- a/src/gallium/drivers/radeon/radeon_vce.h +++ b/src/gallium/drivers/radeon/radeon_vce.h @@ -75,6 +75,7 @@ struct rvce_encoder { void (*pic_control)(struct rvce_encoder *enc); void (*motion_estimation)(struct rvce_encoder *enc); void (*rdo)(struct rvce_encoder *enc); + void (*vui)(struct rvce_encoder *enc); void (*encode)(struct rvce_encoder *enc); void (*destroy)(struct rvce_encoder *enc); @@ -100,6 +101,7 @@ struct rvce_encoder { struct rvid_buffer *fb; struct rvid_buffer cpb; struct pipe_h264_enc_picture_desc pic; + bool use_vui; }; struct pipe_video_codec *rvce_create_encoder(struct pipe_context *context, diff --git a/src/gallium/drivers/radeon/radeon_vce_40_2_2.c b/src/gallium/drivers/radeon/radeon_vce_40_2_2.c index 06d3e95..b176aa7 100644 --- a/src/gallium/drivers/radeon/radeon_vce_40_2_2.c +++ b/src/gallium/drivers/radeon/radeon_vce_40_2_2.c @@ -248,6 +248,57 @@ static void rdo(struct rvce_encoder *enc) RVCE_END(); } +static void vui(struct rvce_encoder *enc) +{ + int i; + + RVCE_BEGIN(0x04000009); // vui + RVCE_CS(0x00000000); //aspectRatioInfoPresentFlag + RVCE_CS(0x00000000); //aspectRatioInfo.aspectRatioIdc + RVCE_CS(0x00000000); //aspectRatioInfo.sarWidth + RVCE_CS(0x00000000); //aspectRatioInfo.sarHeight + RVCE_CS(0x00000000); //overscanInfoPresentFlag + RVCE_CS(0x00000000); //overScanInfo.overscanAppropFlag + RVCE_CS(0x00000000); //videoSignalTypePresentFlag + RVCE_CS(0x00000005); //videoSignalTypeInfo.videoFormat + RVCE_CS(0x00000000); //videoSignalTypeInfo.videoFullRangeFlag + RVCE_CS(0x00000000); //videoSignalTypeInfo.colorDescriptionPresentFlag + RVCE_CS(0x00000002); //videoSignalTypeInfo.colorPrim + RVCE_CS(0x00000002); //videoSignalTypeInfo.transferChar + RVCE_CS(0x00000002); //videoSignalTypeInfo.matrixCoef + RVCE_CS(0x00000000); //chromaLocInfoPresentFlag + RVCE_CS(0x00000000); //chromaLocInfo.chromaLocTop + RVCE_CS(0x00000000); //chromaLocInfo.chromaLocBottom + RVCE_CS(0x00000001); //timingInfoPresentFlag + RVCE_CS(enc->pic.rate_ctrl.frame_rate_den); //timingInfo.numUnitsInTick + RVCE_CS(enc->pic.rate_ctrl.frame_rate_num * 2); //timingInfo.timeScale; + RVCE_CS(0x00000001); //timingInfo.fixedFrameRateFlag + RVCE_CS(0x00000000); //nalHRDParametersPresentFlag + RVCE_CS(0x00000000); //hrdParam.cpbCntMinus1 + RVCE_CS(0x00000004); //hrdParam.bitRateScale + RVCE_CS(0x00000006); //hrdParam.cpbSizeScale + for (i = 0; i < 32; i++) { + RVCE_CS(0x00000000); //hrdParam.bitRateValueMinus + RVCE_CS(0x00000000); //hrdParam.cpbSizeValueMinus + RVCE_CS(0x00000000); //hrdParam.cbrFlag + } + RVCE_CS(0x00000017); //hrdParam.initialCpbRemovalDelayLengthMinus1 + RVCE_CS(0x00000017); //hrdParam.cpbRemovalDelayLengthMinus1 + RVCE_CS(0x00000017); //hrdParam.dpbOutputDelayLengthMinus1 + RVCE_CS(0x00000018); //hrdParam.timeOffsetLength + RVCE_CS(0x00000000); //lowDelayHRDFlag + RVCE_CS(0x00000000); //picStructPresentFlag + RVCE_CS(0x00000000); //bitstreamRestrictionPresentFlag + RVCE_CS(0x00000001); //bitstreamRestrictions.motionVectorsOverPicBoundariesFlag + RVCE_CS(0x00000002); //bitstreamRestrictions.maxBytesPerPicDenom + RVCE_CS(0x00000001); //bitstreamRestrictions.maxBitsPerMbDenom + RVCE_CS(0x00000010); //bitstreamRestrictions.log2MaxMvLengthHori + RVCE_CS(0x00000010); //bitstreamRestrictions.log2MaxMvLengthVert + RVCE_CS(0x00000003); //bitstreamRestrictions.numReorderFrames + RVCE_CS(0x00000003); //bitstreamRestrictions.maxDecFrameBuffering + RVCE_END(); +} + static void encode(struct rvce_encoder *enc) { int i; @@ -396,6 +447,7 @@ void radeon_vce_40_2_2_init(struct rvce_encoder *enc) enc->pic_control = pic_control; enc->motion_estimation = motion_estimation; enc->rdo = rdo; + enc->vui = vui; enc->encode = encode; enc->destroy = destroy; } -- 2.7.4