diff options
-rw-r--r-- | mfx_stub/mfxsession_impl.h | 1 | ||||
-rw-r--r-- | mfx_stub/mfxvideo.c | 46 |
2 files changed, 40 insertions, 7 deletions
diff --git a/mfx_stub/mfxsession_impl.h b/mfx_stub/mfxsession_impl.h index 5b359e1..1edd154 100644 --- a/mfx_stub/mfxsession_impl.h +++ b/mfx_stub/mfxsession_impl.h @@ -32,6 +32,7 @@ struct _mfxSession { mfxMemId* mids; size_t mids_count; + mfxU16 crop_rect[4]; VAPictureParameterBufferHEVC ppb; VASliceParameterBufferHEVC spb; size_t global_frame_counter; diff --git a/mfx_stub/mfxvideo.c b/mfx_stub/mfxvideo.c index a3bc8a8..9e2a829 100644 --- a/mfx_stub/mfxvideo.c +++ b/mfx_stub/mfxvideo.c @@ -89,7 +89,7 @@ static void ParseStRefPicSet(struct Bitstream* nalu, uint64_t stRpsIdx) { } // E.2.1 VUI parameters syntax -static void ParseVuiParameters(struct Bitstream* nalu) { +static void ParseVuiParameters(struct Bitstream* nalu, mfxSession session) { assert(BitstreamReadU(nalu, 1) == 0); // aspect_ratio_info_present_flag assert(BitstreamReadU(nalu, 1) == 0); // overscan_info_present_flag assert(BitstreamReadU(nalu, 1) == 1); // video_signal_type_present_flag @@ -97,7 +97,7 @@ static void ParseVuiParameters(struct Bitstream* nalu) { // Table E.2 – Meaning of video_format assert(BitstreamReadU(nalu, 3) == 5); // video_format assert(BitstreamReadU(nalu, 1) == 0); // video_full_range_flag - assert(BitstreamReadU(nalu, 1) == 1); // colour_description_present_flag + assert(BitstreamReadU(nalu, 1) == 1); // colour_description_present_flag assert(BitstreamReadU(nalu, 8) == 2); // colour_primaries assert(BitstreamReadU(nalu, 8) == 2); // transfer_characteristics @@ -106,6 +106,22 @@ static void ParseVuiParameters(struct Bitstream* nalu) { assert(BitstreamReadU(nalu, 1) == 0); // chroma_loc_info_present_flag assert(BitstreamReadU(nalu, 1) == 0); // neutral_chroma_indication_flag assert(BitstreamReadU(nalu, 1) == 0); // field_seq_flag + assert(BitstreamReadU(nalu, 1) == 0); // frame_field_info_present_flag + + bool default_display_window_flag = !!BitstreamReadU(nalu, 1); + if (default_display_window_flag) { + uint64_t def_disp_win_left_offset = BitstreamReadUE(nalu); + uint64_t def_disp_win_right_offset = BitstreamReadUE(nalu); + uint64_t def_disp_win_top_offset = BitstreamReadUE(nalu); + uint64_t def_disp_win_bottom_offset = BitstreamReadUE(nalu); + session->crop_rect[0] = (mfxU16)def_disp_win_left_offset; + session->crop_rect[1] = (mfxU16)def_disp_win_top_offset; + session->crop_rect[2] = (mfxU16)(session->ppb.pic_width_in_luma_samples - + def_disp_win_right_offset); + session->crop_rect[3] = (mfxU16)(session->ppb.pic_height_in_luma_samples - + def_disp_win_bottom_offset); + } + assert(BitstreamReadU(nalu, 1) == 0); // vui_timing_info_present_flag bool bitstream_restriction_flag = !!BitstreamReadU(nalu, 1); @@ -135,7 +151,22 @@ static void ParseSps(struct Bitstream* nalu, mfxSession session) { assert(session->ppb.pic_fields.bits.chroma_format_idc == 1); session->ppb.pic_width_in_luma_samples = (uint16_t)BitstreamReadUE(nalu); session->ppb.pic_height_in_luma_samples = (uint16_t)BitstreamReadUE(nalu); - assert(BitstreamReadU(nalu, 1) == 0); // conformance_window_flag + bool conformance_window_flag = !!BitstreamReadU(nalu, 1); + if (conformance_window_flag) { + uint64_t conf_win_left_offset = BitstreamReadUE(nalu); + uint64_t conf_win_right_offset = BitstreamReadUE(nalu); + uint64_t conf_win_top_offset = BitstreamReadUE(nalu); + uint64_t conf_win_bottom_offset = BitstreamReadUE(nalu); + session->crop_rect[0] = (mfxU16)conf_win_left_offset; + session->crop_rect[1] = (mfxU16)conf_win_top_offset; + session->crop_rect[2] = (mfxU16)(session->ppb.pic_width_in_luma_samples - + conf_win_right_offset); + session->crop_rect[3] = (mfxU16)(session->ppb.pic_height_in_luma_samples - + conf_win_bottom_offset); + } else { + session->crop_rect[2] = session->ppb.pic_width_in_luma_samples; + session->crop_rect[3] = session->ppb.pic_height_in_luma_samples; + } session->ppb.bit_depth_luma_minus8 = (uint8_t)BitstreamReadUE(nalu); session->ppb.bit_depth_chroma_minus8 = (uint8_t)BitstreamReadUE(nalu); @@ -195,7 +226,7 @@ static void ParseSps(struct Bitstream* nalu, mfxSession session) { (uint32_t)BitstreamReadU(nalu, 1); assert(BitstreamReadU(nalu, 1) == 1); // vui_parameters_present_flag - ParseVuiParameters(nalu); + ParseVuiParameters(nalu, session); assert(BitstreamReadU(nalu, 1) == 0); // sps_extension_present_flag } @@ -618,9 +649,10 @@ mfxStatus MFXVideoDECODE_DecodeFrameAsync(mfxSession session, mfxBitstream* bs, session->local_frame_counter++; *surface_out = surface_work; *surface_work = (mfxFrameSurface1){ - // TODO(mburakov): Implement crop rect!!! - .Info.CropW = session->ppb.pic_width_in_luma_samples, - .Info.CropH = session->ppb.pic_height_in_luma_samples, + .Info.CropX = session->crop_rect[0], + .Info.CropY = session->crop_rect[1], + .Info.CropW = session->crop_rect[2], + .Info.CropH = session->crop_rect[3], .Data.MemId = mid_current, }; } |