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,      };    } | 
