Loading media/libstagefright/ACodec.cpp +94 −24 Original line number Diff line number Diff line Loading @@ -552,6 +552,7 @@ ACodec::ACodec() mNativeWindowUsageBits(0), mLastNativeWindowDataSpace(HAL_DATASPACE_UNKNOWN), mIsVideo(false), mIsImage(false), mIsEncoder(false), mFatalError(false), mShutdownInProgress(false), Loading Loading @@ -1712,6 +1713,7 @@ status_t ACodec::configureCodec( mIsEncoder = encoder; mIsVideo = !strncasecmp(mime, "video/", 6); mIsImage = !strncasecmp(mime, "image/", 6); mPortMode[kPortIndexInput] = IOMX::kPortModePresetByteBuffer; mPortMode[kPortIndexOutput] = IOMX::kPortModePresetByteBuffer; Loading @@ -1727,10 +1729,11 @@ status_t ACodec::configureCodec( // FLAC encoder or video encoder in constant quality mode doesn't need a // bitrate, other encoders do. if (encoder) { if (mIsVideo && !findVideoBitrateControlInfo( msg, &bitrateMode, &bitrate, &quality)) { if (mIsVideo || mIsImage) { if (!findVideoBitrateControlInfo(msg, &bitrateMode, &bitrate, &quality)) { return INVALID_OPERATION; } else if (!mIsVideo && strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC) } } else if (strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC) && !msg->findInt32("bitrate", &bitrate)) { return INVALID_OPERATION; } Loading Loading @@ -2009,7 +2012,7 @@ status_t ACodec::configureCodec( (void)msg->findInt32("pcm-encoding", (int32_t*)&pcmEncoding); // invalid encodings will default to PCM-16bit in setupRawAudioFormat. if (mIsVideo) { if (mIsVideo || mIsImage) { // determine need for software renderer bool usingSwRenderer = false; if (haveNativeWindow && mComponentName.startsWith("OMX.google.")) { Loading Loading @@ -2289,7 +2292,7 @@ status_t ACodec::configureCodec( } // create data converters if needed if (!mIsVideo && err == OK) { if (!mIsVideo && !mIsImage && err == OK) { AudioEncoding codecPcmEncoding = kAudioEncodingPcm16bit; if (encoder) { (void)mInputFormat->findInt32("pcm-encoding", (int32_t*)&codecPcmEncoding); Loading Loading @@ -3214,6 +3217,7 @@ static const struct VideoCodingMapEntry { { MEDIA_MIMETYPE_VIDEO_VP8, OMX_VIDEO_CodingVP8 }, { MEDIA_MIMETYPE_VIDEO_VP9, OMX_VIDEO_CodingVP9 }, { MEDIA_MIMETYPE_VIDEO_DOLBY_VISION, OMX_VIDEO_CodingDolbyVision }, { MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC, OMX_VIDEO_CodingImageHEIC }, }; static status_t GetVideoCodingTypeFromMime( Loading Loading @@ -3871,7 +3875,8 @@ status_t ACodec::setupVideoEncoder( break; case OMX_VIDEO_CodingHEVC: err = setupHEVCEncoderParameters(msg); case OMX_VIDEO_CodingImageHEIC: err = setupHEVCEncoderParameters(msg, outputFormat); break; case OMX_VIDEO_CodingVP8: Loading Loading @@ -4377,27 +4382,63 @@ status_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) { return configureBitrate(bitrateMode, bitrate); } status_t ACodec::setupHEVCEncoderParameters(const sp<AMessage> &msg) { float iFrameInterval; if (!msg->findAsFloat("i-frame-interval", &iFrameInterval)) { return INVALID_OPERATION; status_t ACodec::configureImageGrid( const sp<AMessage> &msg, sp<AMessage> &outputFormat) { int32_t gridWidth, gridHeight, gridRows, gridCols; if (!msg->findInt32("grid-width", &gridWidth) || !msg->findInt32("grid-height", &gridHeight) || !msg->findInt32("grid-rows", &gridRows) || !msg->findInt32("grid-cols", &gridCols)) { return OK; } OMX_VIDEO_PARAM_ANDROID_IMAGEGRIDTYPE gridType; InitOMXParams(&gridType); gridType.nPortIndex = kPortIndexOutput; gridType.bEnabled = OMX_TRUE; gridType.nGridWidth = gridWidth; gridType.nGridHeight = gridHeight; gridType.nGridRows = gridRows; gridType.nGridCols = gridCols; status_t err = mOMXNode->setParameter( (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidImageGrid, &gridType, sizeof(gridType)); // for video encoders, grid config is only a hint. if (!mIsImage) { return OK; } // image encoders must support grid config. if (err != OK) { return err; } // query to get the image encoder's real grid config as it might be // different from the requested, and transfer that to the output. err = mOMXNode->getParameter( (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidImageGrid, &gridType, sizeof(gridType)); if (err == OK && gridType.bEnabled) { outputFormat->setInt32("grid-width", gridType.nGridWidth); outputFormat->setInt32("grid-height", gridType.nGridHeight); outputFormat->setInt32("grid-rows", gridType.nGridRows); outputFormat->setInt32("grid-cols", gridType.nGridCols); } return err; } status_t ACodec::setupHEVCEncoderParameters( const sp<AMessage> &msg, sp<AMessage> &outputFormat) { OMX_VIDEO_CONTROLRATETYPE bitrateMode; int32_t bitrate, quality; if (!findVideoBitrateControlInfo(msg, &bitrateMode, &bitrate, &quality)) { return INVALID_OPERATION; } float frameRate; if (!msg->findFloat("frame-rate", &frameRate)) { int32_t tmp; if (!msg->findInt32("frame-rate", &tmp)) { return INVALID_OPERATION; } frameRate = (float)tmp; } OMX_VIDEO_PARAM_HEVCTYPE hevcType; InitOMXParams(&hevcType); hevcType.nPortIndex = kPortIndexOutput; Loading Loading @@ -4425,7 +4466,27 @@ status_t ACodec::setupHEVCEncoderParameters(const sp<AMessage> &msg) { hevcType.eLevel = static_cast<OMX_VIDEO_HEVCLEVELTYPE>(level); } // TODO: finer control? hevcType.nKeyFrameInterval = setPFramesSpacing(iFrameInterval, frameRate) + 1; if (mIsImage) { hevcType.nKeyFrameInterval = 1; } else { float iFrameInterval; if (!msg->findAsFloat("i-frame-interval", &iFrameInterval)) { return INVALID_OPERATION; } float frameRate; if (!msg->findFloat("frame-rate", &frameRate)) { int32_t tmp; if (!msg->findInt32("frame-rate", &tmp)) { return INVALID_OPERATION; } frameRate = (float)tmp; } hevcType.nKeyFrameInterval = setPFramesSpacing(iFrameInterval, frameRate) + 1; } err = mOMXNode->setParameter( (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); Loading @@ -4433,6 +4494,12 @@ status_t ACodec::setupHEVCEncoderParameters(const sp<AMessage> &msg) { return err; } err = configureImageGrid(msg, outputFormat); if (err != OK) { return err; } return configureBitrate(bitrateMode, bitrate, quality); } Loading Loading @@ -4874,7 +4941,8 @@ status_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { (void)getHDRStaticInfoForVideoCodec(kPortIndexInput, notify); } uint32_t latency = 0; if (mIsEncoder && getLatency(&latency) == OK && latency > 0) { if (mIsEncoder && !mIsImage && getLatency(&latency) == OK && latency > 0) { notify->setInt32("latency", latency); } } Loading Loading @@ -4930,7 +4998,8 @@ status_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { notify->setString("mime", mime.c_str()); } uint32_t intraRefreshPeriod = 0; if (mIsEncoder && getIntraRefreshPeriod(&intraRefreshPeriod) == OK if (mIsEncoder && !mIsImage && getIntraRefreshPeriod(&intraRefreshPeriod) == OK && intraRefreshPeriod > 0) { notify->setInt32("intra-refresh-period", intraRefreshPeriod); } Loading Loading @@ -8207,8 +8276,9 @@ status_t ACodec::queryCapabilities( } bool isVideo = strncasecmp(mime, "video/", 6) == 0; bool isImage = strncasecmp(mime, "image/", 6) == 0; if (isVideo) { if (isVideo || isImage) { OMX_VIDEO_PARAM_PROFILELEVELTYPE param; InitOMXParams(¶m); param.nPortIndex = isEncoder ? kPortIndexOutput : kPortIndexInput; Loading media/libstagefright/NuMediaExtractor.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ #define LOG_NDEBUG 0 //#define LOG_NDEBUG 0 #define LOG_TAG "NuMediaExtractor" #include <utils/Log.h> Loading media/libstagefright/include/media/stagefright/ACodec.h +3 −1 Original line number Diff line number Diff line Loading @@ -253,6 +253,7 @@ private: sp<AMessage> mLastOutputFormat; bool mIsVideo; bool mIsImage; bool mIsEncoder; bool mFatalError; bool mShutdownInProgress; Loading Loading @@ -489,11 +490,12 @@ private: status_t setupMPEG4EncoderParameters(const sp<AMessage> &msg); status_t setupH263EncoderParameters(const sp<AMessage> &msg); status_t setupAVCEncoderParameters(const sp<AMessage> &msg); status_t setupHEVCEncoderParameters(const sp<AMessage> &msg); status_t setupHEVCEncoderParameters(const sp<AMessage> &msg, sp<AMessage> &outputFormat); status_t setupVPXEncoderParameters(const sp<AMessage> &msg, sp<AMessage> &outputFormat); status_t verifySupportForProfileAndLevel(int32_t profile, int32_t level); status_t configureImageGrid(const sp<AMessage> &msg, sp<AMessage> &outputFormat); status_t configureBitrate( OMX_VIDEO_CONTROLRATETYPE bitrateMode, int32_t bitrate, int32_t quality = 0); void configureEncoderLatency(const sp<AMessage> &msg); Loading media/libstagefright/omx/OMXUtils.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,8 @@ const char *GetComponentRole(bool isEncoder, const char *mime) { "audio_decoder.ac3", "audio_encoder.ac3" }, { MEDIA_MIMETYPE_AUDIO_EAC3, "audio_decoder.eac3", "audio_encoder.eac3" }, { MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC, "image_decoder.heic", "image_encoder.heic" }, }; static const size_t kNumMimeToRole = Loading Loading
media/libstagefright/ACodec.cpp +94 −24 Original line number Diff line number Diff line Loading @@ -552,6 +552,7 @@ ACodec::ACodec() mNativeWindowUsageBits(0), mLastNativeWindowDataSpace(HAL_DATASPACE_UNKNOWN), mIsVideo(false), mIsImage(false), mIsEncoder(false), mFatalError(false), mShutdownInProgress(false), Loading Loading @@ -1712,6 +1713,7 @@ status_t ACodec::configureCodec( mIsEncoder = encoder; mIsVideo = !strncasecmp(mime, "video/", 6); mIsImage = !strncasecmp(mime, "image/", 6); mPortMode[kPortIndexInput] = IOMX::kPortModePresetByteBuffer; mPortMode[kPortIndexOutput] = IOMX::kPortModePresetByteBuffer; Loading @@ -1727,10 +1729,11 @@ status_t ACodec::configureCodec( // FLAC encoder or video encoder in constant quality mode doesn't need a // bitrate, other encoders do. if (encoder) { if (mIsVideo && !findVideoBitrateControlInfo( msg, &bitrateMode, &bitrate, &quality)) { if (mIsVideo || mIsImage) { if (!findVideoBitrateControlInfo(msg, &bitrateMode, &bitrate, &quality)) { return INVALID_OPERATION; } else if (!mIsVideo && strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC) } } else if (strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC) && !msg->findInt32("bitrate", &bitrate)) { return INVALID_OPERATION; } Loading Loading @@ -2009,7 +2012,7 @@ status_t ACodec::configureCodec( (void)msg->findInt32("pcm-encoding", (int32_t*)&pcmEncoding); // invalid encodings will default to PCM-16bit in setupRawAudioFormat. if (mIsVideo) { if (mIsVideo || mIsImage) { // determine need for software renderer bool usingSwRenderer = false; if (haveNativeWindow && mComponentName.startsWith("OMX.google.")) { Loading Loading @@ -2289,7 +2292,7 @@ status_t ACodec::configureCodec( } // create data converters if needed if (!mIsVideo && err == OK) { if (!mIsVideo && !mIsImage && err == OK) { AudioEncoding codecPcmEncoding = kAudioEncodingPcm16bit; if (encoder) { (void)mInputFormat->findInt32("pcm-encoding", (int32_t*)&codecPcmEncoding); Loading Loading @@ -3214,6 +3217,7 @@ static const struct VideoCodingMapEntry { { MEDIA_MIMETYPE_VIDEO_VP8, OMX_VIDEO_CodingVP8 }, { MEDIA_MIMETYPE_VIDEO_VP9, OMX_VIDEO_CodingVP9 }, { MEDIA_MIMETYPE_VIDEO_DOLBY_VISION, OMX_VIDEO_CodingDolbyVision }, { MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC, OMX_VIDEO_CodingImageHEIC }, }; static status_t GetVideoCodingTypeFromMime( Loading Loading @@ -3871,7 +3875,8 @@ status_t ACodec::setupVideoEncoder( break; case OMX_VIDEO_CodingHEVC: err = setupHEVCEncoderParameters(msg); case OMX_VIDEO_CodingImageHEIC: err = setupHEVCEncoderParameters(msg, outputFormat); break; case OMX_VIDEO_CodingVP8: Loading Loading @@ -4377,27 +4382,63 @@ status_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) { return configureBitrate(bitrateMode, bitrate); } status_t ACodec::setupHEVCEncoderParameters(const sp<AMessage> &msg) { float iFrameInterval; if (!msg->findAsFloat("i-frame-interval", &iFrameInterval)) { return INVALID_OPERATION; status_t ACodec::configureImageGrid( const sp<AMessage> &msg, sp<AMessage> &outputFormat) { int32_t gridWidth, gridHeight, gridRows, gridCols; if (!msg->findInt32("grid-width", &gridWidth) || !msg->findInt32("grid-height", &gridHeight) || !msg->findInt32("grid-rows", &gridRows) || !msg->findInt32("grid-cols", &gridCols)) { return OK; } OMX_VIDEO_PARAM_ANDROID_IMAGEGRIDTYPE gridType; InitOMXParams(&gridType); gridType.nPortIndex = kPortIndexOutput; gridType.bEnabled = OMX_TRUE; gridType.nGridWidth = gridWidth; gridType.nGridHeight = gridHeight; gridType.nGridRows = gridRows; gridType.nGridCols = gridCols; status_t err = mOMXNode->setParameter( (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidImageGrid, &gridType, sizeof(gridType)); // for video encoders, grid config is only a hint. if (!mIsImage) { return OK; } // image encoders must support grid config. if (err != OK) { return err; } // query to get the image encoder's real grid config as it might be // different from the requested, and transfer that to the output. err = mOMXNode->getParameter( (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidImageGrid, &gridType, sizeof(gridType)); if (err == OK && gridType.bEnabled) { outputFormat->setInt32("grid-width", gridType.nGridWidth); outputFormat->setInt32("grid-height", gridType.nGridHeight); outputFormat->setInt32("grid-rows", gridType.nGridRows); outputFormat->setInt32("grid-cols", gridType.nGridCols); } return err; } status_t ACodec::setupHEVCEncoderParameters( const sp<AMessage> &msg, sp<AMessage> &outputFormat) { OMX_VIDEO_CONTROLRATETYPE bitrateMode; int32_t bitrate, quality; if (!findVideoBitrateControlInfo(msg, &bitrateMode, &bitrate, &quality)) { return INVALID_OPERATION; } float frameRate; if (!msg->findFloat("frame-rate", &frameRate)) { int32_t tmp; if (!msg->findInt32("frame-rate", &tmp)) { return INVALID_OPERATION; } frameRate = (float)tmp; } OMX_VIDEO_PARAM_HEVCTYPE hevcType; InitOMXParams(&hevcType); hevcType.nPortIndex = kPortIndexOutput; Loading Loading @@ -4425,7 +4466,27 @@ status_t ACodec::setupHEVCEncoderParameters(const sp<AMessage> &msg) { hevcType.eLevel = static_cast<OMX_VIDEO_HEVCLEVELTYPE>(level); } // TODO: finer control? hevcType.nKeyFrameInterval = setPFramesSpacing(iFrameInterval, frameRate) + 1; if (mIsImage) { hevcType.nKeyFrameInterval = 1; } else { float iFrameInterval; if (!msg->findAsFloat("i-frame-interval", &iFrameInterval)) { return INVALID_OPERATION; } float frameRate; if (!msg->findFloat("frame-rate", &frameRate)) { int32_t tmp; if (!msg->findInt32("frame-rate", &tmp)) { return INVALID_OPERATION; } frameRate = (float)tmp; } hevcType.nKeyFrameInterval = setPFramesSpacing(iFrameInterval, frameRate) + 1; } err = mOMXNode->setParameter( (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); Loading @@ -4433,6 +4494,12 @@ status_t ACodec::setupHEVCEncoderParameters(const sp<AMessage> &msg) { return err; } err = configureImageGrid(msg, outputFormat); if (err != OK) { return err; } return configureBitrate(bitrateMode, bitrate, quality); } Loading Loading @@ -4874,7 +4941,8 @@ status_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { (void)getHDRStaticInfoForVideoCodec(kPortIndexInput, notify); } uint32_t latency = 0; if (mIsEncoder && getLatency(&latency) == OK && latency > 0) { if (mIsEncoder && !mIsImage && getLatency(&latency) == OK && latency > 0) { notify->setInt32("latency", latency); } } Loading Loading @@ -4930,7 +4998,8 @@ status_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { notify->setString("mime", mime.c_str()); } uint32_t intraRefreshPeriod = 0; if (mIsEncoder && getIntraRefreshPeriod(&intraRefreshPeriod) == OK if (mIsEncoder && !mIsImage && getIntraRefreshPeriod(&intraRefreshPeriod) == OK && intraRefreshPeriod > 0) { notify->setInt32("intra-refresh-period", intraRefreshPeriod); } Loading Loading @@ -8207,8 +8276,9 @@ status_t ACodec::queryCapabilities( } bool isVideo = strncasecmp(mime, "video/", 6) == 0; bool isImage = strncasecmp(mime, "image/", 6) == 0; if (isVideo) { if (isVideo || isImage) { OMX_VIDEO_PARAM_PROFILELEVELTYPE param; InitOMXParams(¶m); param.nPortIndex = isEncoder ? kPortIndexOutput : kPortIndexInput; Loading
media/libstagefright/NuMediaExtractor.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ #define LOG_NDEBUG 0 //#define LOG_NDEBUG 0 #define LOG_TAG "NuMediaExtractor" #include <utils/Log.h> Loading
media/libstagefright/include/media/stagefright/ACodec.h +3 −1 Original line number Diff line number Diff line Loading @@ -253,6 +253,7 @@ private: sp<AMessage> mLastOutputFormat; bool mIsVideo; bool mIsImage; bool mIsEncoder; bool mFatalError; bool mShutdownInProgress; Loading Loading @@ -489,11 +490,12 @@ private: status_t setupMPEG4EncoderParameters(const sp<AMessage> &msg); status_t setupH263EncoderParameters(const sp<AMessage> &msg); status_t setupAVCEncoderParameters(const sp<AMessage> &msg); status_t setupHEVCEncoderParameters(const sp<AMessage> &msg); status_t setupHEVCEncoderParameters(const sp<AMessage> &msg, sp<AMessage> &outputFormat); status_t setupVPXEncoderParameters(const sp<AMessage> &msg, sp<AMessage> &outputFormat); status_t verifySupportForProfileAndLevel(int32_t profile, int32_t level); status_t configureImageGrid(const sp<AMessage> &msg, sp<AMessage> &outputFormat); status_t configureBitrate( OMX_VIDEO_CONTROLRATETYPE bitrateMode, int32_t bitrate, int32_t quality = 0); void configureEncoderLatency(const sp<AMessage> &msg); Loading
media/libstagefright/omx/OMXUtils.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,8 @@ const char *GetComponentRole(bool isEncoder, const char *mime) { "audio_decoder.ac3", "audio_encoder.ac3" }, { MEDIA_MIMETYPE_AUDIO_EAC3, "audio_decoder.eac3", "audio_encoder.eac3" }, { MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC, "image_decoder.heic", "image_encoder.heic" }, }; static const size_t kNumMimeToRole = Loading