summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/media/stagefright/FFMPEGSoftCodec.h1
-rw-r--r--media/libstagefright/ACodec.cpp18
-rw-r--r--media/libstagefright/FFMPEGSoftCodec.cpp127
3 files changed, 96 insertions, 50 deletions
diff --git a/include/media/stagefright/FFMPEGSoftCodec.h b/include/media/stagefright/FFMPEGSoftCodec.h
index 79ea229..c6b6482 100644
--- a/include/media/stagefright/FFMPEGSoftCodec.h
+++ b/include/media/stagefright/FFMPEGSoftCodec.h
@@ -60,6 +60,7 @@ struct FFMPEGSoftCodec {
sp<IOMX> OMXhandle, IOMX::node_id nodeID);
static status_t setVideoFormat(
+ status_t status,
const sp<AMessage> &msg, const char* mime,
sp<IOMX> OMXhandle,IOMX::node_id nodeID,
bool isEncoder, OMX_VIDEO_CODINGTYPE *compressionFormat,
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 6d26173..4286d3c 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -2966,13 +2966,11 @@ status_t ACodec::setupVideoDecoder(
OMX_VIDEO_CODINGTYPE compressionFormat;
status_t err = GetVideoCodingTypeFromMime(mime, &compressionFormat);
- if (err != OK) {
- err = FFMPEGSoftCodec::setVideoFormat(
+ err = FFMPEGSoftCodec::setVideoFormat(err,
msg, mime, mOMX, mNode, mIsEncoder, &compressionFormat,
mComponentName.c_str());
- if (err != OK) {
- return err;
- }
+ if (err != OK) {
+ return err;
}
err = setVideoPortFormatType(
@@ -3121,14 +3119,12 @@ status_t ACodec::setupVideoEncoder(const char *mime, const sp<AMessage> &msg) {
OMX_VIDEO_CODINGTYPE compressionFormat;
err = GetVideoCodingTypeFromMime(mime, &compressionFormat);
- if (err != OK) {
- err = FFMPEGSoftCodec::setVideoFormat(
+ err = FFMPEGSoftCodec::setVideoFormat(err,
msg, mime, mOMX, mNode, mIsEncoder, &compressionFormat,
mComponentName.c_str());
- if (err != OK) {
- ALOGE("Not a supported video mime type: %s", mime);
- return err;
- }
+ if (err != OK) {
+ ALOGE("Not a supported video mime type: %s", mime);
+ return err;
}
err = setVideoPortFormatType(
diff --git a/media/libstagefright/FFMPEGSoftCodec.cpp b/media/libstagefright/FFMPEGSoftCodec.cpp
index 9d72609..26afd89 100644
--- a/media/libstagefright/FFMPEGSoftCodec.cpp
+++ b/media/libstagefright/FFMPEGSoftCodec.cpp
@@ -254,56 +254,63 @@ void FFMPEGSoftCodec::overrideComponentName(
}
status_t FFMPEGSoftCodec::setVideoFormat(
+ status_t status,
const sp<AMessage> &msg, const char* mime, sp<IOMX> OMXhandle,
IOMX::node_id nodeID, bool isEncoder,
OMX_VIDEO_CODINGTYPE *compressionFormat,
const char* componentName) {
status_t err = OK;
- if (isEncoder) {
- ALOGE("Encoding not supported");
- err = BAD_VALUE;
-
- } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_WMV, mime)) {
- if (strncmp(componentName, "OMX.ffmpeg.", 11) == 0) {
- err = setWMVFormat(msg, OMXhandle, nodeID);
+ //ALOGD("setVideoFormat: %s", msg->debugString(0).c_str());
+
+ /* status passed in is the result of the normal codec lookup */
+ if (status != OK) {
+
+ if (isEncoder) {
+ ALOGE("Encoding not supported");
+ err = BAD_VALUE;
+
+ } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_WMV, mime)) {
+ if (strncmp(componentName, "OMX.ffmpeg.", 11) == 0) {
+ err = setWMVFormat(msg, OMXhandle, nodeID);
+ if (err != OK) {
+ ALOGE("setWMVFormat() failed (err = %d)", err);
+ }
+ }
+ *compressionFormat = OMX_VIDEO_CodingWMV;
+ } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_RV, mime)) {
+ err = setRVFormat(msg, OMXhandle, nodeID);
if (err != OK) {
- ALOGE("setWMVFormat() failed (err = %d)", err);
+ ALOGE("setRVFormat() failed (err = %d)", err);
+ } else {
+ *compressionFormat = OMX_VIDEO_CodingRV;
}
- }
- *compressionFormat = OMX_VIDEO_CodingWMV;
- } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_RV, mime)) {
- err = setRVFormat(msg, OMXhandle, nodeID);
- if (err != OK) {
- ALOGE("setRVFormat() failed (err = %d)", err);
- } else {
- *compressionFormat = OMX_VIDEO_CodingRV;
- }
- } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_VC1, mime)) {
- *compressionFormat = (OMX_VIDEO_CODINGTYPE)OMX_VIDEO_CodingVC1;
- } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_FLV1, mime)) {
- *compressionFormat = (OMX_VIDEO_CODINGTYPE)OMX_VIDEO_CodingFLV1;
- } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_DIVX, mime)) {
- *compressionFormat = (OMX_VIDEO_CODINGTYPE)OMX_VIDEO_CodingDIVX;
+ } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_VC1, mime)) {
+ *compressionFormat = (OMX_VIDEO_CODINGTYPE)OMX_VIDEO_CodingVC1;
+ } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_FLV1, mime)) {
+ *compressionFormat = (OMX_VIDEO_CODINGTYPE)OMX_VIDEO_CodingFLV1;
+ } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_DIVX, mime)) {
+ *compressionFormat = (OMX_VIDEO_CODINGTYPE)OMX_VIDEO_CodingDIVX;
#ifdef QCOM_HARDWARE
- // compressionFormat will be override later
- } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_DIVX4, mime)) {
- *compressionFormat = (OMX_VIDEO_CODINGTYPE)OMX_VIDEO_CodingDIVX;
- } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_DIVX311, mime)) {
- *compressionFormat = (OMX_VIDEO_CODINGTYPE)OMX_VIDEO_CodingDIVX;
+ // compressionFormat will be override later
+ } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_DIVX4, mime)) {
+ *compressionFormat = (OMX_VIDEO_CODINGTYPE)OMX_VIDEO_CodingDIVX;
+ } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_DIVX311, mime)) {
+ *compressionFormat = (OMX_VIDEO_CODINGTYPE)OMX_VIDEO_CodingDIVX;
#endif
- } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_HEVC, mime)) {
- *compressionFormat = (OMX_VIDEO_CODINGTYPE)OMX_VIDEO_CodingHEVC;
- } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_FFMPEG, mime)) {
- ALOGV("Setting the OMX_VIDEO_PARAM_FFMPEGTYPE params");
- err = setFFmpegVideoFormat(msg, OMXhandle, nodeID);
- if (err != OK) {
- ALOGE("setFFmpegVideoFormat() failed (err = %d)", err);
+ } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_HEVC, mime)) {
+ *compressionFormat = (OMX_VIDEO_CODINGTYPE)OMX_VIDEO_CodingHEVC;
+ } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_FFMPEG, mime)) {
+ ALOGV("Setting the OMX_VIDEO_PARAM_FFMPEGTYPE params");
+ err = setFFmpegVideoFormat(msg, OMXhandle, nodeID);
+ if (err != OK) {
+ ALOGE("setFFmpegVideoFormat() failed (err = %d)", err);
+ } else {
+ *compressionFormat = OMX_VIDEO_CodingAutoDetect;
+ }
} else {
- *compressionFormat = OMX_VIDEO_CodingAutoDetect;
+ err = BAD_TYPE;
}
- } else {
- err = BAD_TYPE;
}
#ifdef QCOM_HARDWARE
@@ -312,7 +319,7 @@ status_t FFMPEGSoftCodec::setVideoFormat(
// from the CAF L release. It was unfortunately moved to a proprietary
// blob and an architecture which is hellish for OEMs who wish to
// customize the platform.
- if (err != BAD_TYPE && (!strncmp(componentName, "OMX.qcom.", 9))) {
+ if (err == OK && (!strncmp(componentName, "OMX.qcom.", 9))) {
status_t xerr = OK;
@@ -344,13 +351,29 @@ status_t FFMPEGSoftCodec::setVideoFormat(
// Enable timestamp reordering for mpeg4 and vc1 codec types, the AVI file
// type, and hevc content in the ts container
+ AString container;
+ const char * containerStr = NULL;
+ if (msg->findString("file-format", &container)) {
+ containerStr = container.c_str();
+ }
+
bool tsReorder = false;
const char* roleVC1 = "OMX.qcom.video.decoder.vc1";
const char* roleMPEG4 = "OMX.qcom.video.decoder.mpeg4";
+ const char* roleHEVC = "OMX.qcom.video.decoder.hevc";
if (!strncmp(componentName, roleVC1, strlen(roleVC1)) ||
!strncmp(componentName, roleMPEG4, strlen(roleMPEG4))) {
// The codec requires timestamp reordering
tsReorder = true;
+ } else if (containerStr != NULL) {
+ if (!strncmp(containerStr, MEDIA_MIMETYPE_CONTAINER_AVI,
+ strlen(MEDIA_MIMETYPE_CONTAINER_AVI))) {
+ tsReorder = true;
+ } else if (!strncmp(containerStr, MEDIA_MIMETYPE_CONTAINER_MPEG2TS,
+ strlen(MEDIA_MIMETYPE_CONTAINER_MPEG2TS)) ||
+ !strncmp(componentName, roleHEVC, strlen(roleHEVC))) {
+ tsReorder = true;
+ }
}
if (tsReorder) {
@@ -368,6 +391,32 @@ status_t FFMPEGSoftCodec::setVideoFormat(
}
}
+ // Enable Sync-frame decode mode for thumbnails
+ int32_t thumbnailMode = 0;
+ if (msg->findInt32("thumbnail-mode", &thumbnailMode) &&
+ thumbnailMode > 0) {
+ ALOGV("Enabling thumbnail mode.");
+ QOMX_ENABLETYPE enableType;
+ OMX_INDEXTYPE indexType;
+
+ status_t err = OMXhandle->getExtensionIndex(
+ nodeID, OMX_QCOM_INDEX_PARAM_VIDEO_SYNCFRAMEDECODINGMODE,
+ &indexType);
+ if (err != OK) {
+ ALOGW("Failed to get extension for SYNCFRAMEDECODINGMODE");
+ } else {
+
+ enableType.bEnable = OMX_TRUE;
+ err = OMXhandle->setParameter(nodeID,indexType,
+ (void *)&enableType, sizeof(enableType));
+ if (err != OK) {
+ ALOGW("Failed to get extension for SYNCFRAMEDECODINGMODE");
+ } else {
+ ALOGI("Thumbnail mode enabled.");
+ }
+ }
+ }
+
// MediaCodec clients can request decoder extradata by setting
// "enable-extradata-<type>" in MediaFormat.
// Following <type>s are supported: