📄 umc_mpeg2_video_encoder.cpp
字号:
/*////////////////////////////////////////////////////////////////////////////////// INTEL CORPORATION PROPRIETARY INFORMATION// This software is supplied under the terms of a license agreement or// nondisclosure agreement with Intel Corporation and may not be copied// or disclosed except in accordance with the terms of that agreement.// Copyright(c) 2002-2005 Intel Corporation. All Rights Reserved.//*/#include "umc_video_data.h"#include "umc_video_encoder.h"#include "umc_mpeg2_video_encoder.h"#include "mpeg2_video_encoder.h"namespace UMC{static Status errorsIPP2UMC(IppStatus st) { if (st == ippStsOk) { // OK return UMC_OK; } else if ((int)st > 0) { // Warning return UMC_WRN_NOT_CRITICAL_BAD_FORMAT; } else { switch(st) { // Error case ippStsErr: return UMC_OPERATION_FAILED; case ippStsNullPtrErr: return UMC_NULL_PTR; case ippStsBadArgErr: return UMC_BAD_FORMAT; case ippStsMemAllocErr: return UMC_FAILED_TO_ALLOCATE_BUFFER; default: return UMC_OPERATION_FAILED; } }}MPEG2EncoderParams::MPEG2EncoderParams() { lFlags = FLAG_VENC_REORDER;}MPEG2EncoderParams::MPEG2EncoderParams(ippMPEG2EncoderParams *par) { lFlags = FLAG_VENC_REORDER; *(ippMPEG2EncoderParams*)this = *par;}Status MPEG2EncoderParams::ReadParamFile(const vm_char *ParFileName, vm_char *SrcFileName){ int _Width, _Height, _BitRate, _NumFramesToEncode; IppStatus ret; ippMPEG2EncoderParams *ippMPEG2Params = (ippMPEG2EncoderParams*)this; ret = ippMPEG2Params->ReadParamFile(ParFileName, SrcFileName, &_Width, &_Height, &_NumFramesToEncode, &_BitRate); src_width = _Width; src_height = _Height; numFramesToEncode = _NumFramesToEncode; BitRate = _BitRate; return errorsIPP2UMC(ret);}//////////////////////////////////////////////////////////////////////// class MPEG2VideoEncoder: public VideoEncoder implementation// Just calls ippMPEG2VideoEncoder//constructorMPEG2VideoEncoder::MPEG2VideoEncoder(){ encoder = new ippMPEG2VideoEncoder; lFlags = FLAG_VENC_REORDER;}//destructorMPEG2VideoEncoder::~MPEG2VideoEncoder(){ delete ((ippMPEG2VideoEncoder*)encoder);}// Initialize codec with specified parameter(s)Status MPEG2VideoEncoder::Init(BaseCodecParams *init){ VideoEncoderParams *VideoParams = DynamicCast<VideoEncoderParams>(init); MPEG2EncoderParams *MPEG2Params = DynamicCast<MPEG2EncoderParams>(init); ippMPEG2EncoderParams *ippMPEG2Params = NULL; IppStatus ret; if (NULL != MPEG2Params) { ippMPEG2Params = (ippMPEG2EncoderParams*)MPEG2Params; lFlags = MPEG2Params->lFlags; } ret = ((ippMPEG2VideoEncoder*)encoder)->Init( VideoParams->src_width, VideoParams->src_height, VideoParams->BitRate, ippMPEG2Params); return errorsIPP2UMC(ret);}// Compress (decompress) next frameStatus MPEG2VideoEncoder::GetFrame(MediaData *in, MediaData *out){ ippMPEG2VideoEncoder *enc = (ippMPEG2VideoEncoder*)encoder; Ipp32s encoded_size; VideoData *vin; Ipp8u *_YUV[3]; Ipp32s _YUV_pitch[3]; Ipp8u **YUV = _YUV; Ipp32s *YUV_pitch = _YUV_pitch; IppStatus ret; vin = DynamicCast<VideoData> (in); if (in != NULL) { if (vin == NULL) { return UMC_BAD_FORMAT; } YUV[0] = vin->m_lpDest[0]; YUV[1] = vin->m_lpDest[1]; YUV[2] = vin->m_lpDest[2]; YUV_pitch[0] = vin->m_lPitch[0]; YUV_pitch[1] = vin->m_lPitch[1]; YUV_pitch[2] = vin->m_lPitch[2]; } else { YUV = NULL; YUV_pitch = NULL; } if (lFlags & FLAG_VENC_REORDER) { ret = (enc->EncodeFrame)(YUV, YUV_pitch, (Ipp8u*)out->GetDataPointer(), out->GetDataSize(), &encoded_size); } else { ret = (enc->EncodeFrameReordered)(YUV, YUV_pitch, vin->m_FrameType, (Ipp8u*)out->GetDataPointer(), out->GetDataSize(), &encoded_size); } if (vin != NULL) { out->SetTime(vin->GetTime()); vin->SetDataSize(0); } out->SetDataSize(encoded_size); if(encoded_size == 0 && in == 0) return UMC_END_OF_STREAM; return errorsIPP2UMC(ret);}// Get codec working (initialization) parameter(s)Status MPEG2VideoEncoder::GetInfo(BaseCodecParams *info){ ippMPEG2VideoEncoder *enc = (ippMPEG2VideoEncoder*)encoder; VideoEncoderParams *VideoParams = DynamicCast<VideoEncoderParams>(info); MPEG2EncoderParams *MPEG2Params = DynamicCast<MPEG2EncoderParams>(info); ippMPEG2EncoderParams *ippMPEG2Params = NULL; int Width, Height, BitRate; IppStatus ret; if (NULL == VideoParams) { return UMC_NULL_PTR; } if (NULL != MPEG2Params) { ippMPEG2Params = (ippMPEG2EncoderParams*)MPEG2Params; } ret = enc->GetInfo( &Width, &Height, &VideoParams->FrameRate, &BitRate, ippMPEG2Params); VideoParams->src_width = Width; VideoParams->src_height = Height; VideoParams->BitRate = BitRate; return errorsIPP2UMC(ret);}// Close all codec resourcesStatus MPEG2VideoEncoder::Close(){ ippMPEG2VideoEncoder *enc = (ippMPEG2VideoEncoder*)encoder; IppStatus ret = enc->Close(); return errorsIPP2UMC(ret);}Status MPEG2VideoEncoder::Reset(){ return UMC_UNSUPPORTED;}Status MPEG2VideoEncoder::SetParams (BaseCodecParams* /*params*/){ return UMC_UNSUPPORTED;}VideoEncoder *createMPEG2VideoEncoder(){ VideoEncoder* ptr = new MPEG2VideoEncoder; return ptr;}};//namespace UMC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -