diff --git a/_studio/mfx_lib/decode/mjpeg/include/mfx_mjpeg_dec_decode.h b/_studio/mfx_lib/decode/mjpeg/include/mfx_mjpeg_dec_decode.h index 756e38a702..233eedd0c5 100644 --- a/_studio/mfx_lib/decode/mjpeg/include/mfx_mjpeg_dec_decode.h +++ b/_studio/mfx_lib/decode/mjpeg/include/mfx_mjpeg_dec_decode.h @@ -35,6 +35,7 @@ #include #include "mfx_task.h" +#include "umc_media_data.h" #include "mfx_vpp_jpeg_d3d9.h" @@ -45,6 +46,7 @@ namespace UMC class JpegFrameConstructor; class MediaDataEx; class FrameData; + class MediaData; }; class VideoDECODEMJPEGBase @@ -70,7 +72,11 @@ class VideoDECODEMJPEGBase virtual mfxStatus RunThread(void *pParam, mfxU32 threadNumber, mfxU32 callNumber) = 0; virtual mfxStatus CompleteTask(void *pParam, mfxStatus taskRes) = 0; virtual void ReleaseReservedTask() = 0; +#if (MFX_VERSION >= MFX_VERSION) + virtual mfxStatus AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic, UMC::MediaData *in) = 0; +#else virtual mfxStatus AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic) = 0; +#endif virtual mfxStatus AllocateFrameData(UMC::FrameData *&data) = 0; virtual mfxStatus FillEntryPoint(MFX_ENTRY_POINT *pEntryPoint, mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_out) = 0; @@ -103,7 +109,11 @@ class VideoDECODEMJPEGBase_HW : public VideoDECODEMJPEGBase virtual mfxStatus CheckTaskAvailability(mfxU32 maxTaskNumber); virtual mfxStatus ReserveUMCDecoder(UMC::MJPEGVideoDecoderBaseMFX* &pMJPEGVideoDecoder, mfxFrameSurface1 *surf, bool isOpaq); virtual void ReleaseReservedTask(); +#if (MFX_VERSION >= MFX_VERSION) + virtual mfxStatus AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic, UMC::MediaData *in); +#else virtual mfxStatus AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic); +#endif virtual mfxStatus AllocateFrameData(UMC::FrameData *&data); virtual mfxStatus FillEntryPoint(MFX_ENTRY_POINT *pEntryPoint, mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_out); @@ -149,7 +159,11 @@ class VideoDECODEMJPEGBase_SW : public VideoDECODEMJPEGBase mfxStatus CheckTaskAvailability(mfxU32 maxTaskNumber) override; mfxStatus ReserveUMCDecoder(UMC::MJPEGVideoDecoderBaseMFX* &pMJPEGVideoDecoder, mfxFrameSurface1 *surf, bool isOpaq) override; void ReleaseReservedTask() override; +#if (MFX_VERSION >= MFX_VERSION) + mfxStatus AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic, UMC::MediaData *in) override; +#else mfxStatus AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic) override; +#endif mfxStatus AllocateFrameData(UMC::FrameData *&data) override; mfxStatus FillEntryPoint(MFX_ENTRY_POINT *pEntryPoint, mfxFrameSurface1 *surface_work, mfxFrameSurface1 *surface_out) override; diff --git a/_studio/mfx_lib/decode/mjpeg/src/mfx_mjpeg_dec_decode.cpp b/_studio/mfx_lib/decode/mjpeg/src/mfx_mjpeg_dec_decode.cpp index be16693a27..38b354402e 100644 --- a/_studio/mfx_lib/decode/mjpeg/src/mfx_mjpeg_dec_decode.cpp +++ b/_studio/mfx_lib/decode/mjpeg/src/mfx_mjpeg_dec_decode.cpp @@ -437,6 +437,16 @@ mfxStatus VideoDECODEMJPEG::DecodeHeader(VideoCORE *core, mfxBitstream *bs, mfxV UMC::Status umcRes = decoder.Init(&umcVideoParams); MFX_CHECK_INIT(umcRes == UMC::UMC_OK); +#if (MFX_VERSION >= MFX_VERSION) + mfxExtBuffer* extbuf = (bs) ? GetExtendedBuffer(bs->ExtParam, bs->NumExtParam, MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; + + if (extbuf) + { + reinterpret_cast(extbuf)->ErrorTypes = 0; + in.SetExtBuffer(extbuf); + } + #endif + umcRes = decoder.DecodeHeader(&in); in.Save(bs); @@ -783,6 +793,16 @@ mfxStatus VideoDECODEMJPEG::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 MFXMediaDataAdapter src(bs); UMC::MediaDataEx *pSrcData; +#if (MFX_VERSION >= MFX_VERSION) + mfxExtBuffer* extbuf = (bs) ? GetExtendedBuffer(bs->ExtParam, bs->NumExtParam, MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; + + if (extbuf) + { + reinterpret_cast(extbuf)->ErrorTypes = 0; + src.SetExtBuffer(extbuf); + } +#endif + if (!m_isHeaderFound && bs) { umcRes = pMJPEGVideoDecoder->FindStartOfImage(&src); @@ -798,7 +818,11 @@ mfxStatus VideoDECODEMJPEG::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 if (!m_isHeaderParsed && bs) { +#if (MFX_VERSION >= MFX_VERSION) + umcRes = pMJPEGVideoDecoder->_GetFrameInfo((uint8_t*)src.GetDataPointer(), src.GetDataSize(), &src); +#else umcRes = pMJPEGVideoDecoder->_GetFrameInfo((uint8_t*)src.GetDataPointer(), src.GetDataSize()); +#endif if (umcRes != UMC::UMC_OK) { if(umcRes != UMC::UMC_ERR_NOT_ENOUGH_DATA) @@ -854,7 +878,11 @@ mfxStatus VideoDECODEMJPEG::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 try { +#if (MFX_VERSION >= MFX_VERSION) + MFX_SAFE_CALL(decoder->AddPicture(pSrcData, numPic, &src)); +#else MFX_SAFE_CALL(decoder->AddPicture(pSrcData, numPic)); +#endif } catch(const UMC::eUMC_Status& sts) { @@ -1880,7 +1908,11 @@ void VideoDECODEMJPEGBase_HW::ReleaseReservedTask() } } +#if (MFX_VERSION >= MFX_VERSION) +mfxStatus VideoDECODEMJPEGBase_HW::AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic, UMC::MediaData *in) +#else mfxStatus VideoDECODEMJPEGBase_HW::AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic) +#endif { mfxU32 fieldPos = m_numPic; @@ -1899,7 +1931,11 @@ mfxStatus VideoDECODEMJPEGBase_HW::AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 return ConvertUMCStatusToMfx(umcRes); } +#if (MFX_VERSION >= MFX_VERSION) + umcRes = m_pMJPEGVideoDecoder->GetFrame(pSrcData, &m_dst, fieldPos, in); +#else umcRes = m_pMJPEGVideoDecoder->GetFrame(pSrcData, &m_dst, fieldPos); +#endif mfxStatus sts = MFX_ERR_NONE; @@ -2118,7 +2154,11 @@ void VideoDECODEMJPEGBase_SW::ReleaseReservedTask() m_freeTasks.front()->Reset(); } +#if (MFX_VERSION >= MFX_VERSION) +mfxStatus VideoDECODEMJPEGBase_SW::AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic, UMC::MediaData *in) +#else mfxStatus VideoDECODEMJPEGBase_SW::AddPicture(UMC::MediaDataEx *pSrcData, mfxU32 & numPic) +#endif { // select the field position. 0 means top, 1 means bottom. mfxU32 fieldPos = m_freeTasks.front()->NumPicCollected(); diff --git a/_studio/shared/umc/codec/jpeg_dec/include/jpegdec.h b/_studio/shared/umc/codec/jpeg_dec/include/jpegdec.h index def97585b5..206ddc7f8c 100644 --- a/_studio/shared/umc/codec/jpeg_dec/include/jpegdec.h +++ b/_studio/shared/umc/codec/jpeg_dec/include/jpegdec.h @@ -24,6 +24,7 @@ #include "umc_defs.h" #if defined (MFX_ENABLE_MJPEG_VIDEO_DECODE) #include "jpegdec_base.h" +#include "umc_media_data.h" class CBaseStreamInput; diff --git a/_studio/shared/umc/codec/jpeg_dec/include/jpegdec_base.h b/_studio/shared/umc/codec/jpeg_dec/include/jpegdec_base.h index 69f1194848..e884c1bb00 100644 --- a/_studio/shared/umc/codec/jpeg_dec/include/jpegdec_base.h +++ b/_studio/shared/umc/codec/jpeg_dec/include/jpegdec_base.h @@ -29,6 +29,7 @@ #include "colorcomp.h" #include "membuffin.h" #include "bitstreamin.h" +#include "mfxstructures.h" class CJPEGDecoderBase { @@ -42,6 +43,16 @@ class CJPEGDecoderBase JERRCODE SetSource(const uint8_t* pBuf, size_t buflen); JERRCODE Seek(long offset, int origin); +#if (MFX_VERSION >= MFX_VERSION) + virtual JERRCODE ReadHeader( + int* width, + int* height, + int* nchannels, + JCOLOR* color, + JSS* sampling, + int* precision, + mfxExtDecodeErrorReport* pDecodeErrorReport); +#else virtual JERRCODE ReadHeader( int* width, int* height, @@ -49,6 +60,7 @@ class CJPEGDecoderBase JCOLOR* color, JSS* sampling, int* precision); +#endif int GetNumDecodedBytes(void) { return m_BitStreamIn.GetNumUsedBytes(); } @@ -131,7 +143,11 @@ class CJPEGDecoderBase JERRCODE FindSOI(); +#if (MFX_VERSION >= MFX_VERSION) + virtual JERRCODE ParseJPEGBitStream(JOPERATION op, mfxExtDecodeErrorReport* pDecodeErrorReport); +#else virtual JERRCODE ParseJPEGBitStream(JOPERATION op); +#endif JERRCODE ParseSOI(void); JERRCODE ParseEOI(void); JERRCODE ParseAPP0(void); diff --git a/_studio/shared/umc/codec/jpeg_dec/include/umc_mjpeg_mfx_decode_base.h b/_studio/shared/umc/codec/jpeg_dec/include/umc_mjpeg_mfx_decode_base.h index ccadb8e909..423c586263 100644 --- a/_studio/shared/umc/codec/jpeg_dec/include/umc_mjpeg_mfx_decode_base.h +++ b/_studio/shared/umc/codec/jpeg_dec/include/umc_mjpeg_mfx_decode_base.h @@ -79,7 +79,11 @@ class MJPEGVideoDecoderBaseMFX Status FindStartOfImage(MediaData * in); // All memory sizes should come in size_t type +#if (MFX_VERSION >= MFX_VERSION) + Status _GetFrameInfo(const uint8_t* pBitStream, size_t nSize, MediaData *in); +#else Status _GetFrameInfo(const uint8_t* pBitStream, size_t nSize); +#endif Status SetRotation(uint16_t rotation); diff --git a/_studio/shared/umc/codec/jpeg_dec/include/umc_mjpeg_mfx_decode_hw.h b/_studio/shared/umc/codec/jpeg_dec/include/umc_mjpeg_mfx_decode_hw.h index eae240b8e2..c2b8aa8331 100644 --- a/_studio/shared/umc/codec/jpeg_dec/include/umc_mjpeg_mfx_decode_hw.h +++ b/_studio/shared/umc/codec/jpeg_dec/include/umc_mjpeg_mfx_decode_hw.h @@ -83,7 +83,11 @@ class MJPEGVideoDecoderMFX_HW : public MJPEGVideoDecoderBaseMFX Status CloseFrame(UMC::FrameData** in, const mfxU32 fieldPos); // Get next frame +#if (MFX_VERSION >= MFX_VERSION) + virtual Status GetFrame(UMC::MediaDataEx *pSrcData, UMC::FrameData** out, const mfxU32 fieldPos, UMC::MediaData *in); +#else virtual Status GetFrame(UMC::MediaDataEx *pSrcData, UMC::FrameData** out, const mfxU32 fieldPos); +#endif virtual ConvertInfo * GetConvertInfo(); @@ -97,10 +101,17 @@ class MJPEGVideoDecoderMFX_HW : public MJPEGVideoDecoderBaseMFX Status _DecodeField(); +#if (MFX_VERSION >= MFX_VERSION) + Status _DecodeHeader(int32_t* nUsedBytes, mfxExtDecodeErrorReport* pDecodeErrorReport); +#else Status _DecodeHeader(int32_t* nUsedBytes); +#endif +#if (MFX_VERSION >= MFX_VERSION) + virtual Status _DecodeField(MediaDataEx* in, mfxExtDecodeErrorReport* pDecodeErrorReport); +#else virtual Status _DecodeField(MediaDataEx* in); - +#endif Status PackHeaders(MediaData* src, JPEG_DECODE_SCAN_PARAMETER* obtainedScanParams, uint8_t* buffersForUpdate); Status PackPriorityParams(); diff --git a/_studio/shared/umc/codec/jpeg_dec/src/jpegdec_base.cpp b/_studio/shared/umc/codec/jpeg_dec/src/jpegdec_base.cpp index 4c4c7b8ed4..2ca45750bc 100644 --- a/_studio/shared/umc/codec/jpeg_dec/src/jpegdec_base.cpp +++ b/_studio/shared/umc/codec/jpeg_dec/src/jpegdec_base.cpp @@ -29,6 +29,26 @@ #include "vm_debug.h" +#if (MFX_VERSION >= MFX_VERSION) +inline void SetDecodeErrorTypes(JMARKER m_marker, mfxExtDecodeErrorReport *pDecodeErrorReport) +{ + if (!pDecodeErrorReport) + return; + + switch (m_marker) + { + case JM_APP0: pDecodeErrorReport->ErrorTypes |= MFX_ERROR_APP0_MARKER; break; + case JM_APP14: pDecodeErrorReport->ErrorTypes |= MFX_ERROR_APP14_MARKER; break; + case JM_DQT: pDecodeErrorReport->ErrorTypes |= MFX_ERROR_DQT_MARKER; break; + case JM_SOF0: pDecodeErrorReport->ErrorTypes |= MFX_ERROR_SOF0_MARKER; break; + case JM_DHT: pDecodeErrorReport->ErrorTypes |= MFX_ERROR_DHT_MARKER; break; + case JM_DRI: pDecodeErrorReport->ErrorTypes |= MFX_ERROR_DRI_MARKER; break; + case JM_SOS: pDecodeErrorReport->ErrorTypes |= MFX_ERROR_SOS_MARKER; break; + default: pDecodeErrorReport->ErrorTypes |= MFX_ERROR_UNKNOWN_MARKER; break; + }; +} +#endif + CJPEGDecoderBase::CJPEGDecoderBase(void) { Reset(); @@ -1220,7 +1240,12 @@ JERRCODE CJPEGDecoderBase::ParseSOS(JOPERATION op) return JPEG_OK; } // CJPEGDecoderBase::ParseSOS() + +#if (MFX_VERSION >= MFX_VERSION) +JERRCODE CJPEGDecoderBase::ParseJPEGBitStream(JOPERATION op, mfxExtDecodeErrorReport* pDecodeErrorReport) +#else JERRCODE CJPEGDecoderBase::ParseJPEGBitStream(JOPERATION op) +#endif { JERRCODE jerr = JPEG_OK; @@ -1251,6 +1276,9 @@ JERRCODE CJPEGDecoderBase::ParseJPEGBitStream(JOPERATION op) jerr = ParseAPP0(); if(JPEG_OK != jerr) { +#if (MFX_VERSION >= MFX_VERSION) + SetDecodeErrorTypes(m_marker, pDecodeErrorReport); +#endif return jerr; } break; @@ -1259,6 +1287,9 @@ JERRCODE CJPEGDecoderBase::ParseJPEGBitStream(JOPERATION op) jerr = ParseAPP14(); if(JPEG_OK != jerr) { +#if (MFX_VERSION >= MFX_VERSION) + SetDecodeErrorTypes(m_marker, pDecodeErrorReport); +#endif return jerr; } break; @@ -1267,6 +1298,9 @@ JERRCODE CJPEGDecoderBase::ParseJPEGBitStream(JOPERATION op) jerr = ParseDQT(); if(JPEG_OK != jerr) { +#if (MFX_VERSION >= MFX_VERSION) + SetDecodeErrorTypes(m_marker, pDecodeErrorReport); +#endif return jerr; } break; @@ -1275,6 +1309,9 @@ JERRCODE CJPEGDecoderBase::ParseJPEGBitStream(JOPERATION op) jerr = ParseSOF0(); if(JPEG_OK != jerr) { +#if (MFX_VERSION >= MFX_VERSION) + SetDecodeErrorTypes(m_marker, pDecodeErrorReport); +#endif return jerr; } break; @@ -1297,6 +1334,9 @@ JERRCODE CJPEGDecoderBase::ParseJPEGBitStream(JOPERATION op) jerr = ParseDHT(); if(JPEG_OK != jerr) { +#if (MFX_VERSION >= MFX_VERSION) + SetDecodeErrorTypes(m_marker, pDecodeErrorReport); +#endif return jerr; } break; @@ -1305,6 +1345,9 @@ JERRCODE CJPEGDecoderBase::ParseJPEGBitStream(JOPERATION op) jerr = ParseDRI(); if(JPEG_OK != jerr) { +#if (MFX_VERSION >= MFX_VERSION) + SetDecodeErrorTypes(m_marker, pDecodeErrorReport); +#endif return jerr; } break; @@ -1313,6 +1356,9 @@ JERRCODE CJPEGDecoderBase::ParseJPEGBitStream(JOPERATION op) jerr = ParseSOS(op); if(JPEG_OK != jerr) { +#if (MFX_VERSION >= MFX_VERSION) + SetDecodeErrorTypes(m_marker, pDecodeErrorReport); +#endif return jerr; } @@ -1322,7 +1368,12 @@ JERRCODE CJPEGDecoderBase::ParseJPEGBitStream(JOPERATION op) { jerr = m_BitStreamIn.Seek(-(m_sos_len + 2)); if(JPEG_OK != jerr) + { +#if (MFX_VERSION >= MFX_VERSION) + SetDecodeErrorTypes(m_marker, pDecodeErrorReport); +#endif return jerr; + } } else { @@ -1344,7 +1395,9 @@ JERRCODE CJPEGDecoderBase::ParseJPEGBitStream(JOPERATION op) jerr = SkipMarker(); if(JPEG_OK != jerr) return jerr; - +#if (MFX_VERSION >= MFX_VERSION) + SetDecodeErrorTypes(m_marker, pDecodeErrorReport); +#endif break; } } @@ -1391,6 +1444,16 @@ JERRCODE CJPEGDecoderBase::FindSOI() } } // CJPEGDecoderBase::ParseJPEGBitStream() +#if (MFX_VERSION >= MFX_VERSION) +JERRCODE CJPEGDecoderBase::ReadHeader( + int* width, + int* height, + int* nchannels, + JCOLOR* color, + JSS* sampling, + int* precision, + mfxExtDecodeErrorReport* pDecodeErrorReport) +#else JERRCODE CJPEGDecoderBase::ReadHeader( int* width, int* height, @@ -1398,13 +1461,18 @@ JERRCODE CJPEGDecoderBase::ReadHeader( JCOLOR* color, JSS* sampling, int* precision) +#endif { int du_width; int du_height; JERRCODE jerr; // parse bitstream up to SOS marker +#if (MFX_VERSION >= MFX_VERSION) + jerr = ParseJPEGBitStream(JO_READ_HEADER, pDecodeErrorReport); +#else jerr = ParseJPEGBitStream(JO_READ_HEADER); +#endif if(JPEG_OK != jerr) { diff --git a/_studio/shared/umc/codec/jpeg_dec/src/umc_mjpeg_mfx_decode_base.cpp b/_studio/shared/umc/codec/jpeg_dec/src/umc_mjpeg_mfx_decode_base.cpp index d3078fb70e..2338b3ab3a 100644 --- a/_studio/shared/umc/codec/jpeg_dec/src/umc_mjpeg_mfx_decode_base.cpp +++ b/_studio/shared/umc/codec/jpeg_dec/src/umc_mjpeg_mfx_decode_base.cpp @@ -322,7 +322,11 @@ Status MJPEGVideoDecoderBaseMFX::DecodeHeader(MediaData* in) } } +#if (MFX_VERSION >= MFX_VERSION) + Status sts = _GetFrameInfo((uint8_t*)in->GetDataPointer(), in->GetDataSize(), in); +#else Status sts = _GetFrameInfo((uint8_t*)in->GetDataPointer(), in->GetDataSize()); +#endif if (sts == UMC_ERR_NOT_ENOUGH_DATA && (!(in->GetFlags() & MediaData::FLAG_VIDEO_DATA_NOT_FULL_FRAME) || @@ -340,7 +344,11 @@ Status MJPEGVideoDecoderBaseMFX::SetRotation(uint16_t /* rotation */) return UMC_OK; } +#if (MFX_VERSION >= MFX_VERSION) +Status MJPEGVideoDecoderBaseMFX::_GetFrameInfo(const uint8_t* pBitStream, size_t nSize, MediaData *in) +#else Status MJPEGVideoDecoderBaseMFX::_GetFrameInfo(const uint8_t* pBitStream, size_t nSize) +#endif { int32_t nchannels; int32_t precision; @@ -348,6 +356,11 @@ Status MJPEGVideoDecoderBaseMFX::_GetFrameInfo(const uint8_t* pBitStream, size_t JCOLOR color; JERRCODE jerr; +#if (MFX_VERSION >= MFX_VERSION) + MediaData::AuxInfo* aux = (in) ? in->GetAuxInfo(MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; + mfxExtDecodeErrorReport* pDecodeErrorReport = (aux) ? reinterpret_cast(aux->ptr) : NULL; +#endif + if (!m_IsInit) return UMC_ERR_NOT_INITIALIZED; @@ -355,8 +368,13 @@ Status MJPEGVideoDecoderBaseMFX::_GetFrameInfo(const uint8_t* pBitStream, size_t if(JPEG_OK != jerr) return UMC_ERR_FAILED; +#if (MFX_VERSION >= MFX_VERSION) + jerr = m_decBase->ReadHeader( + &m_frameDims.width,&m_frameDims.height,&nchannels,&color,&sampling,&precision,pDecodeErrorReport); +#else jerr = m_decBase->ReadHeader( &m_frameDims.width,&m_frameDims.height,&nchannels,&color,&sampling,&precision); +#endif if(JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; diff --git a/_studio/shared/umc/codec/jpeg_dec/src/umc_mjpeg_mfx_decode_hw.cpp b/_studio/shared/umc/codec/jpeg_dec/src/umc_mjpeg_mfx_decode_hw.cpp index 1fd50defd5..8716bfc741 100644 --- a/_studio/shared/umc/codec/jpeg_dec/src/umc_mjpeg_mfx_decode_hw.cpp +++ b/_studio/shared/umc/codec/jpeg_dec/src/umc_mjpeg_mfx_decode_hw.cpp @@ -225,7 +225,11 @@ mfxStatus MJPEGVideoDecoderMFX_HW::CheckStatusReportNumber(uint32_t statusReport return MFX_TASK_DONE; } +#if (MFX_VERSION >= MFX_VERSION) +Status MJPEGVideoDecoderMFX_HW::_DecodeHeader(int32_t* cnt, mfxExtDecodeErrorReport* pDecodeErrorReport) +#else Status MJPEGVideoDecoderMFX_HW::_DecodeHeader(int32_t* cnt) +#endif { JSS sampling; JERRCODE jerr; @@ -236,8 +240,13 @@ Status MJPEGVideoDecoderMFX_HW::_DecodeHeader(int32_t* cnt) mfxSize size = {}; int32_t frameChannels, framePrecision; +#if (MFX_VERSION >= MFX_VERSION) + jerr = m_decBase->ReadHeader( + &size.width, &size.height, &frameChannels, &m_color, &sampling, &framePrecision, pDecodeErrorReport); +#else jerr = m_decBase->ReadHeader( &size.width, &size.height, &frameChannels, &m_color, &sampling, &framePrecision); +#endif if(JPEG_ERR_BUFF == jerr) return UMC_ERR_NOT_ENOUGH_DATA; @@ -258,14 +267,22 @@ Status MJPEGVideoDecoderMFX_HW::_DecodeHeader(int32_t* cnt) return UMC_OK; } +#if (MFX_VERSION >= MFX_VERSION) +Status MJPEGVideoDecoderMFX_HW::_DecodeField(MediaDataEx* in, mfxExtDecodeErrorReport* pDecodeErrorReport) +#else Status MJPEGVideoDecoderMFX_HW::_DecodeField(MediaDataEx* in) +#endif { int32_t nUsedBytes = 0; if(JPEG_OK != m_decBase->SetSource((uint8_t*)in->GetDataPointer(), (int32_t)in->GetDataSize())) return UMC_ERR_FAILED; +#if (MFX_VERSION >= MFX_VERSION) + Status status = _DecodeHeader(&nUsedBytes, pDecodeErrorReport); +#else Status status = _DecodeHeader(&nUsedBytes); +#endif if (status > 0) { in->MoveDataPointer(nUsedBytes); @@ -759,11 +776,22 @@ uint16_t MJPEGVideoDecoderMFX_HW::GetNumScans(MediaDataEx* in) return numScans; } +#if (MFX_VERSION >= MFX_VERSION) +Status MJPEGVideoDecoderMFX_HW::GetFrame(UMC::MediaDataEx *pSrcData, + UMC::FrameData** out, + const mfxU32 fieldPos, + UMC::MediaData *in) +#else Status MJPEGVideoDecoderMFX_HW::GetFrame(UMC::MediaDataEx *pSrcData, UMC::FrameData** out, const mfxU32 fieldPos) +#endif { Status status = UMC_OK; +#if (MFX_VERSION >= MFX_VERSION) + UMC::MediaData::AuxInfo* aux = (in) ? in->GetAuxInfo(MFX_EXTBUFF_DECODE_ERROR_REPORT) : NULL; + mfxExtDecodeErrorReport* pDecodeErrorReport = (aux) ? reinterpret_cast(aux->ptr) : NULL; +#endif if(0 == out) { @@ -780,7 +808,11 @@ Status MJPEGVideoDecoderMFX_HW::GetFrame(UMC::MediaDataEx *pSrcData, if(m_interleaved) { // interleaved frame +#if (MFX_VERSION >= MFX_VERSION) + status = _DecodeField(pSrcData, pDecodeErrorReport); +#else status = _DecodeField(pSrcData); +#endif if (status > 0) { return UMC_OK; @@ -798,7 +830,11 @@ Status MJPEGVideoDecoderMFX_HW::GetFrame(UMC::MediaDataEx *pSrcData, else { // progressive frame +#if (MFX_VERSION >= MFX_VERSION) + status = _DecodeField(pSrcData, pDecodeErrorReport); +#else status = _DecodeField(pSrcData); +#endif if (status > 0) { return UMC_OK; diff --git a/api/include/mfxstructures.h b/api/include/mfxstructures.h index d4b8b96bf8..1785d284b8 100644 --- a/api/include/mfxstructures.h +++ b/api/include/mfxstructures.h @@ -1861,11 +1861,21 @@ MFX_PACK_END() #if (MFX_VERSION >= 1025) /*ErrorTypes in mfxExtDecodeErrorReport*/ enum { - MFX_ERROR_PPS = (1 << 0), - MFX_ERROR_SPS = (1 << 1), - MFX_ERROR_SLICEHEADER = (1 << 2), - MFX_ERROR_SLICEDATA = (1 << 3), - MFX_ERROR_FRAME_GAP = (1 << 4), + MFX_ERROR_PPS = (1 << 0), + MFX_ERROR_SPS = (1 << 1), + MFX_ERROR_SLICEHEADER = (1 << 2), + MFX_ERROR_SLICEDATA = (1 << 3), + MFX_ERROR_FRAME_GAP = (1 << 4), +#if (MFX_VERSION >= MFX_VERSION) + MFX_ERROR_APP0_MARKER = (1 << 5), + MFX_ERROR_APP14_MARKER = (1 << 6), + MFX_ERROR_DQT_MARKER = (1 << 7), + MFX_ERROR_SOF0_MARKER = (1 << 8), + MFX_ERROR_DHT_MARKER = (1 << 9), + MFX_ERROR_DRI_MARKER = (1 << 10), + MFX_ERROR_SOS_MARKER = (1 << 11), + MFX_ERROR_UNKNOWN_MARKER = (1 << 12), +#endif }; MFX_PACK_BEGIN_USUAL_STRUCT() diff --git a/samples/sample_decode/include/pipeline_decode.h b/samples/sample_decode/include/pipeline_decode.h index 27d2ea5b31..0b4d1cb571 100644 --- a/samples/sample_decode/include/pipeline_decode.h +++ b/samples/sample_decode/include/pipeline_decode.h @@ -211,6 +211,31 @@ class CDecodingPipeline: if (pDecodeErrorReport->ErrorTypes & MFX_ERROR_FRAME_GAP) msdk_printf(MSDK_STRING("[Error] Frame Gap Error detected!\n")); +#if (MFX_VERSION >= MFX_VERSION) + if (pDecodeErrorReport->ErrorTypes & MFX_ERROR_APP0_MARKER) + msdk_printf(MSDK_STRING("[Error] APP0 marker Error detected!\n")); + + if (pDecodeErrorReport->ErrorTypes & MFX_ERROR_APP14_MARKER) + msdk_printf(MSDK_STRING("[Error] APP14 marker Error detected!\n")); + + if (pDecodeErrorReport->ErrorTypes & MFX_ERROR_DQT_MARKER) + msdk_printf(MSDK_STRING("[Error] DGT marker Error detected!\n")); + + if (pDecodeErrorReport->ErrorTypes & MFX_ERROR_SOF0_MARKER) + msdk_printf(MSDK_STRING("[Error] SOF0 marker Error detected!\n")); + + if (pDecodeErrorReport->ErrorTypes & MFX_ERROR_DHT_MARKER) + msdk_printf(MSDK_STRING("[Error] DHT marker Error detected!\n")); + + if (pDecodeErrorReport->ErrorTypes & MFX_ERROR_DRI_MARKER) + msdk_printf(MSDK_STRING("[Error] DRI marker Error detected!\n")); + + if (pDecodeErrorReport->ErrorTypes & MFX_ERROR_SOS_MARKER) + msdk_printf(MSDK_STRING("[Error] SOS marker Error detected!\n")); + + if (pDecodeErrorReport->ErrorTypes & MFX_ERROR_UNKNOWN_MARKER) + msdk_printf(MSDK_STRING("[Error] unknown marker Error detected!\n")); +#endif } } #endif