@ -501,7 +501,7 @@ void C2SoftAvcDec::getVersion() {
status_t C2SoftAvcDec : : initDecoder ( ) {
status_t C2SoftAvcDec : : initDecoder ( ) {
if ( OK ! = createDecoder ( ) ) return UNKNOWN_ERROR ;
if ( OK ! = createDecoder ( ) ) return UNKNOWN_ERROR ;
mNumCores = MIN ( getCpuCoreCount ( ) , MAX_NUM_CORES ) ;
mNumCores = MIN ( getCpuCoreCount ( ) , MAX_NUM_CORES ) ;
mStride = ALIGN 128 ( mWidth ) ;
mStride = ALIGN 32 ( mWidth ) ;
mSignalledError = false ;
mSignalledError = false ;
resetPlugin ( ) ;
resetPlugin ( ) ;
( void ) setNumCores ( ) ;
( void ) setNumCores ( ) ;
@ -519,10 +519,20 @@ bool C2SoftAvcDec::setDecodeArgs(ivd_video_decode_ip_t *ps_decode_ip,
size_t inSize ,
size_t inSize ,
uint32_t tsMarker ) {
uint32_t tsMarker ) {
uint32_t displayStride = mStride ;
uint32_t displayStride = mStride ;
if ( outBuffer ) {
C2PlanarLayout layout ;
layout = outBuffer - > layout ( ) ;
displayStride = layout . planes [ C2PlanarLayout : : PLANE_Y ] . rowInc ;
}
uint32_t displayHeight = mHeight ;
uint32_t displayHeight = mHeight ;
size_t lumaSize = displayStride * displayHeight ;
size_t lumaSize = displayStride * displayHeight ;
size_t chromaSize = lumaSize > > 2 ;
size_t chromaSize = lumaSize > > 2 ;
if ( mStride ! = displayStride ) {
mStride = displayStride ;
if ( OK ! = setParams ( mStride , IVD_DECODE_FRAME ) ) return false ;
}
ps_decode_ip - > u4_size = sizeof ( ivd_video_decode_ip_t ) ;
ps_decode_ip - > u4_size = sizeof ( ivd_video_decode_ip_t ) ;
ps_decode_ip - > e_cmd = IVD_CMD_VIDEO_DECODE ;
ps_decode_ip - > e_cmd = IVD_CMD_VIDEO_DECODE ;
if ( inBuffer ) {
if ( inBuffer ) {
@ -756,24 +766,21 @@ c2_status_t C2SoftAvcDec::ensureDecoderState(const std::shared_ptr<C2BlockPool>
ALOGE ( " not supposed to be here, invalid decoder context " ) ;
ALOGE ( " not supposed to be here, invalid decoder context " ) ;
return C2_CORRUPTED ;
return C2_CORRUPTED ;
}
}
if ( mStride ! = ALIGN128 ( mWidth ) ) {
mStride = ALIGN128 ( mWidth ) ;
if ( OK ! = setParams ( mStride , IVD_DECODE_FRAME ) ) return C2_CORRUPTED ;
}
if ( mOutBlock & &
if ( mOutBlock & &
( mOutBlock - > width ( ) ! = mStride | | mOutBlock - > height ( ) ! = mHeight ) ) {
( mOutBlock - > width ( ) ! = ALIGN32 ( mWidth ) | | mOutBlock - > height ( ) ! = mHeight ) ) {
mOutBlock . reset ( ) ;
mOutBlock . reset ( ) ;
}
}
if ( ! mOutBlock ) {
if ( ! mOutBlock ) {
uint32_t format = HAL_PIXEL_FORMAT_YV12 ;
uint32_t format = HAL_PIXEL_FORMAT_YV12 ;
C2MemoryUsage usage = { C2MemoryUsage : : CPU_READ , C2MemoryUsage : : CPU_WRITE } ;
C2MemoryUsage usage = { C2MemoryUsage : : CPU_READ , C2MemoryUsage : : CPU_WRITE } ;
c2_status_t err = pool - > fetchGraphicBlock ( mStride , mHeight , format , usage , & mOutBlock ) ;
c2_status_t err =
pool - > fetchGraphicBlock ( ALIGN32 ( mWidth ) , mHeight , format , usage , & mOutBlock ) ;
if ( err ! = C2_OK ) {
if ( err ! = C2_OK ) {
ALOGE ( " fetchGraphicBlock for Output failed with status %d " , err ) ;
ALOGE ( " fetchGraphicBlock for Output failed with status %d " , err ) ;
return err ;
return err ;
}
}
ALOGV ( " provided (%dx%d) required (%dx%d) " ,
ALOGV ( " provided (%dx%d) required (%dx%d) " ,
mOutBlock - > width ( ) , mOutBlock - > height ( ) , mStride , mHeight ) ;
mOutBlock - > width ( ) , mOutBlock - > height ( ) , ALIGN32( mWidth ) , mHeight ) ;
}
}
return C2_OK ;
return C2_OK ;
@ -909,7 +916,8 @@ void C2SoftAvcDec::process(
if ( 0 < s_decode_op . u4_pic_wd & & 0 < s_decode_op . u4_pic_ht ) {
if ( 0 < s_decode_op . u4_pic_wd & & 0 < s_decode_op . u4_pic_ht ) {
if ( mHeaderDecoded = = false ) {
if ( mHeaderDecoded = = false ) {
mHeaderDecoded = true ;
mHeaderDecoded = true ;
setParams ( ALIGN128 ( s_decode_op . u4_pic_wd ) , IVD_DECODE_FRAME ) ;
mStride = ALIGN32 ( s_decode_op . u4_pic_wd ) ;
setParams ( mStride , IVD_DECODE_FRAME ) ;
}
}
if ( s_decode_op . u4_pic_wd ! = mWidth | | s_decode_op . u4_pic_ht ! = mHeight ) {
if ( s_decode_op . u4_pic_wd ! = mWidth | | s_decode_op . u4_pic_ht ! = mHeight ) {
mWidth = s_decode_op . u4_pic_wd ;
mWidth = s_decode_op . u4_pic_wd ;