History

add maxbitrate parameter

ruil2 committed 12 years ago

Commit 258185f1 parent cb46a3c6 files · +137 −23Browse files

Showing the changes to codec/encoder/plus/src/welsEncoderExt.cpp (1 of 6 files). Show all

Unified · Split

codec/encoder/plus/src/welsEncoderExt.cpp+93−8
@@ -510,8 +510,10 @@ int CWelsH264SVCEncoder::EncodeFrame (const SSourcePicture* kpSrcPic, SFrameBSIn · 509 unmodified lines
510510 }
511511
512512 const int32_t kiEncoderReturn = EncodeFrameInternal(kpSrcPic, pBsInfo);
513+
513514 if(kiEncoderReturn != cmResultSuccess)
514515 return kiEncoderReturn;
516+
515517 #ifdef REC_FRAME_COUNT
516518 ++ m_uiCountFrameNum;
517519 WelsLog (m_pEncContext, WELS_LOG_INFO,
@@ -521,7 +523,7 @@ int CWelsH264SVCEncoder::EncodeFrame (const SSourcePicture* kpSrcPic, SFrameBSIn · 3 unmodified lines
521523 #ifdef DUMP_SRC_PICTURE
522524 DumpSrcPicture (pSrc);
523525 #endif // DUMP_SRC_PICTURE
524− return cmResultSuccess;
526+ return kiEncoderReturn;
525527 }
526528
527529
@@ -540,7 +542,6 @@ int CWelsH264SVCEncoder::EncodeFrameInternal(const SSourcePicture* pSrcPic, SFr · 12 unmodified lines
540542 WelsLog (m_pEncContext, WELS_LOG_ERROR, "unexpected return(%d) from EncodeFrameInternal()!\n", kiEncoderReturn);
541543 return cmUnkonwReason;
542544 }
543−
544545 ///////////////////for test
545546 #ifdef OUTPUT_BIT_STREAM
546547 if (pBsInfo->eOutputFrameType != videoFrameTypeInvalid && pBsInfo->eOutputFrameType != videoFrameTypeSkip) {
@@ -826,18 +827,80 @@ int CWelsH264SVCEncoder::SetOption (ENCODER_OPTION eOptionId, void* pOption) { · 279 unmodified lines
826827 }
827828 break;
828829 case ENCODER_OPTION_BITRATE: { // Target bit-rate
829− int32_t iValue = * ((int32_t*)pOption);
830+ SBitrateInfo*pInfo = (static_cast<SBitrateInfo *>(pOption));
831+ int32_t iBitrate = pInfo->iBitrate;
830832 #ifdef REC_FRAME_COUNT
831833 WelsLog (m_pEncContext, WELS_LOG_INFO,
832834 "CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_BITRATE, m_uiCountFrameNum= %d, m_iCspInternal= 0x%x, iValue= %d\n",
833835 m_uiCountFrameNum, m_iCspInternal, iValue);
834836 #endif//REC_FRAME_COUNT
835− if (iValue<=0) {
836− return cmInitParaError;
837+ if (iBitrate<=0) {
838+ WelsLog (m_pEncContext, WELS_LOG_ERROR,"CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_BITRATE,iBitrate = %d\n",iBitrate);
839+ return cmInitParaError;
837840 }
841+ iBitrate = WELS_CLIP3 (iBitrate, MIN_BIT_RATE, MAX_BIT_RATE);
842+ switch(pInfo->iLayer){
843+ case SPATIAL_LAYER_ALL:
844+ m_pEncContext->pSvcParam->iTargetBitrate = iBitrate;
845+ break;
846+ case SPATIAL_LAYER_0:
847+ m_pEncContext->pSvcParam->sSpatialLayers[0].iSpatialBitrate = iBitrate;
848+ break;
849+ case SPATIAL_LAYER_1:
850+ m_pEncContext->pSvcParam->sSpatialLayers[1].iSpatialBitrate = iBitrate;
851+ break;
852+ case SPATIAL_LAYER_2:
853+ m_pEncContext->pSvcParam->sSpatialLayers[2].iSpatialBitrate = iBitrate;
854+ break;
855+ case SPATIAL_LAYER_3:
856+ m_pEncContext->pSvcParam->sSpatialLayers[3].iSpatialBitrate = iBitrate;
857+ break;
858+ default:
859+ WelsLog (m_pEncContext, WELS_LOG_ERROR,"CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_BITRATE,iLayer = %d\n",pInfo->iLayer);
860+ return cmInitParaError;
861+ break;
862+ }
838863 //adjust to valid range
839− m_pEncContext->pSvcParam->iTargetBitrate = WELS_CLIP3 (iValue, MIN_BIT_RATE, MAX_BIT_RATE);
840− WelsEncoderApplyBitRate (m_pEncContext->pSvcParam);
864+ WelsEncoderApplyBitRate (m_pEncContext->pSvcParam,pInfo->iLayer);
865+ }
866+ break;
867+ case ENCODER_OPTION_MAX_BITRATE: { // Target bit-rate
868+ SBitrateInfo*pInfo = (static_cast<SBitrateInfo *>(pOption));
869+ int32_t iBitrate = pInfo->iBitrate;
870+
871+#ifdef REC_FRAME_COUNT
872+ WelsLog (m_pEncContext, WELS_LOG_INFO,
873+ "CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_BITRATE, m_uiCountFrameNum= %d, m_iCspInternal= 0x%x, iValue= %d\n",
874+ m_uiCountFrameNum, m_iCspInternal, iValue);
875+#endif//REC_FRAME_COUNT
876+ if (iBitrate<=0) {
877+ WelsLog (m_pEncContext, WELS_LOG_ERROR,"CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_MAX_BITRATE,iBitrate = %d\n",iBitrate);
878+ return cmInitParaError;
879+ }
880+ iBitrate = WELS_CLIP3 (iBitrate, MIN_BIT_RATE, MAX_BIT_RATE);
881+ switch(pInfo->iLayer){
882+ case SPATIAL_LAYER_ALL:
883+ m_pEncContext->pSvcParam->iMaxBitrate = iBitrate;
884+ break;
885+ case SPATIAL_LAYER_0:
886+ m_pEncContext->pSvcParam->sSpatialLayers[0].iMaxSpatialBitrate = iBitrate;
887+ break;
888+ case SPATIAL_LAYER_1:
889+ m_pEncContext->pSvcParam->sSpatialLayers[1].iMaxSpatialBitrate = iBitrate;
890+ break;
891+ case SPATIAL_LAYER_2:
892+ m_pEncContext->pSvcParam->sSpatialLayers[2].iMaxSpatialBitrate = iBitrate;
893+ break;
894+ case SPATIAL_LAYER_3:
895+ m_pEncContext->pSvcParam->sSpatialLayers[3].iMaxSpatialBitrate = iBitrate;
896+ break;
897+ default:
898+ WelsLog (m_pEncContext, WELS_LOG_ERROR,"CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_MAX_BITRATE,iLayer = %d\n",pInfo->iLayer);
899+ return cmInitParaError;
900+ break;
901+ }
902+ //adjust to valid range
903+ WelsEncoderApplyBitRate (m_pEncContext->pSvcParam,pInfo->iLayer);
841904 }
842905 break;
843906 case ENCODER_OPTION_RC_MODE: { // 0:quality mode;1:bit-rate mode
@@ -990,7 +1053,29 @@ int CWelsH264SVCEncoder::GetOption (ENCODER_OPTION eOptionId, void* pOption) { · 146 unmodified lines
9901053 "CWelsH264SVCEncoder::GetOption():ENCODER_OPTION_BITRATE, m_uiCountFrameNum= %d, m_iCspInternal= 0x%x\n",
9911054 m_uiCountFrameNum, m_iCspInternal);
9921055 #endif//REC_FRAME_COUNT
993− * ((int32_t*)pOption) = m_pEncContext->pSvcParam->iTargetBitrate;
1056+ SBitrateInfo*pInfo = (static_cast<SBitrateInfo *>(pOption));
1057+ if((pInfo->iLayer!=SPATIAL_LAYER_ALL)||(pInfo->iLayer!=SPATIAL_LAYER_0)||(pInfo->iLayer!=SPATIAL_LAYER_1)||(pInfo->iLayer!=SPATIAL_LAYER_2)||(pInfo->iLayer!=SPATIAL_LAYER_3))
1058+ return cmInitParaError;
1059+ if(pInfo->iLayer == SPATIAL_LAYER_ALL){
1060+ pInfo->iBitrate = m_pEncContext->pSvcParam->iTargetBitrate;
1061+ }else{
1062+ pInfo->iBitrate = m_pEncContext->pSvcParam->sSpatialLayers[pInfo->iLayer].iSpatialBitrate;
1063+ }
1064+ }
1065+ break;
1066+ case ENCODER_OPTION_MAX_BITRATE: { // Target bit-rate
1067+#ifdef REC_FRAME_COUNT
1068+ WelsLog (m_pEncContext, WELS_LOG_INFO,"CWelsH264SVCEncoder::GetOption():ENCODER_OPTION_MAX_BITRATE, m_uiCountFrameNum= %d, m_iCspInternal= 0x%x\n",
1069+ m_uiCountFrameNum, m_iCspInternal);
1070+#endif//REC_FRAME_COUNT
1071+ SBitrateInfo*pInfo = (static_cast<SBitrateInfo *>(pOption));
1072+ if((pInfo->iLayer!=SPATIAL_LAYER_ALL)||(pInfo->iLayer!=SPATIAL_LAYER_0)||(pInfo->iLayer!=SPATIAL_LAYER_1)||(pInfo->iLayer!=SPATIAL_LAYER_2)||(pInfo->iLayer!=SPATIAL_LAYER_3))
1073+ return cmInitParaError;
1074+ if(pInfo->iLayer == SPATIAL_LAYER_ALL){
1075+ pInfo->iBitrate = m_pEncContext->pSvcParam->iMaxBitrate;
1076+ }else{
1077+ pInfo->iBitrate = m_pEncContext->pSvcParam->sSpatialLayers[pInfo->iLayer].iMaxSpatialBitrate;
1078+ }
9941079 }
9951080 break;
9961081 default:

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t