Support profile and level query for SW video decoders
Change-Id: I9c20db128be96cd36cf2083e08e8c21f5e6d1fdf
This commit is contained in:
@@ -184,6 +184,11 @@ public:
|
||||
uint32_t flags = 0);
|
||||
};
|
||||
|
||||
struct CodecProfileLevel {
|
||||
OMX_U32 mProfile;
|
||||
OMX_U32 mLevel;
|
||||
};
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif // ANDROID_IOMX_H_
|
||||
|
||||
@@ -336,11 +336,6 @@ private:
|
||||
OMXCodec &operator=(const OMXCodec &);
|
||||
};
|
||||
|
||||
struct CodecProfileLevel {
|
||||
OMX_U32 mProfile;
|
||||
OMX_U32 mLevel;
|
||||
};
|
||||
|
||||
struct CodecCapabilities {
|
||||
String8 mComponentName;
|
||||
Vector<CodecProfileLevel> mProfileLevels;
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <media/stagefright/foundation/ADebug.h>
|
||||
#include <media/stagefright/MediaDefs.h>
|
||||
#include <media/stagefright/MediaErrors.h>
|
||||
#include <media/IOMX.h>
|
||||
|
||||
#include "avcdec_api.h"
|
||||
#include "avcdec_int.h"
|
||||
@@ -31,6 +32,13 @@ namespace android {
|
||||
|
||||
static const char kStartCode[4] = { 0x00, 0x00, 0x00, 0x01 };
|
||||
|
||||
static const CodecProfileLevel kProfileLevels[] = {
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1b },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel11 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel12 },
|
||||
};
|
||||
|
||||
template<class T>
|
||||
static void InitOMXParams(T *params) {
|
||||
params->nSize = sizeof(T);
|
||||
@@ -181,6 +189,28 @@ OMX_ERRORTYPE SoftAVC::internalGetParameter(
|
||||
return OMX_ErrorNone;
|
||||
}
|
||||
|
||||
case OMX_IndexParamVideoProfileLevelQuerySupported:
|
||||
{
|
||||
OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevel =
|
||||
(OMX_VIDEO_PARAM_PROFILELEVELTYPE *) params;
|
||||
|
||||
if (profileLevel->nPortIndex != 0) { // Input port only
|
||||
LOGE("Invalid port index: %ld", profileLevel->nPortIndex);
|
||||
return OMX_ErrorUnsupportedIndex;
|
||||
}
|
||||
|
||||
size_t index = profileLevel->nProfileIndex;
|
||||
size_t nProfileLevels =
|
||||
sizeof(kProfileLevels) / sizeof(kProfileLevels[0]);
|
||||
if (index >= nProfileLevels) {
|
||||
return OMX_ErrorNoMore;
|
||||
}
|
||||
|
||||
profileLevel->eProfile = kProfileLevels[index].mProfile;
|
||||
profileLevel->eLevel = kProfileLevels[index].mLevel;
|
||||
return OMX_ErrorNone;
|
||||
}
|
||||
|
||||
default:
|
||||
return SimpleSoftOMXComponent::internalGetParameter(index, params);
|
||||
}
|
||||
|
||||
@@ -23,11 +23,31 @@
|
||||
#include <media/stagefright/foundation/ADebug.h>
|
||||
#include <media/stagefright/MediaDefs.h>
|
||||
#include <media/stagefright/MediaErrors.h>
|
||||
#include <media/IOMX.h>
|
||||
|
||||
#include "mp4dec_api.h"
|
||||
|
||||
namespace android {
|
||||
|
||||
static const CodecProfileLevel kM4VProfileLevels[] = {
|
||||
{ OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0 },
|
||||
{ OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0b },
|
||||
{ OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1 },
|
||||
{ OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level2 },
|
||||
{ OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3 },
|
||||
};
|
||||
|
||||
static const CodecProfileLevel kH263ProfileLevels[] = {
|
||||
{ OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level10 },
|
||||
{ OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level20 },
|
||||
{ OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level30 },
|
||||
{ OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level45 },
|
||||
{ OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level10 },
|
||||
{ OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level20 },
|
||||
{ OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level30 },
|
||||
{ OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level45 },
|
||||
};
|
||||
|
||||
template<class T>
|
||||
static void InitOMXParams(T *params) {
|
||||
params->nSize = sizeof(T);
|
||||
@@ -181,6 +201,39 @@ OMX_ERRORTYPE SoftMPEG4::internalGetParameter(
|
||||
return OMX_ErrorNone;
|
||||
}
|
||||
|
||||
case OMX_IndexParamVideoProfileLevelQuerySupported:
|
||||
{
|
||||
OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevel =
|
||||
(OMX_VIDEO_PARAM_PROFILELEVELTYPE *) params;
|
||||
|
||||
if (profileLevel->nPortIndex != 0) { // Input port only
|
||||
LOGE("Invalid port index: %ld", profileLevel->nPortIndex);
|
||||
return OMX_ErrorUnsupportedIndex;
|
||||
}
|
||||
|
||||
size_t index = profileLevel->nProfileIndex;
|
||||
if (mMode == MODE_H263) {
|
||||
size_t nProfileLevels =
|
||||
sizeof(kH263ProfileLevels) / sizeof(kH263ProfileLevels[0]);
|
||||
if (index >= nProfileLevels) {
|
||||
return OMX_ErrorNoMore;
|
||||
}
|
||||
|
||||
profileLevel->eProfile = kH263ProfileLevels[index].mProfile;
|
||||
profileLevel->eLevel = kH263ProfileLevels[index].mLevel;
|
||||
} else {
|
||||
size_t nProfileLevels =
|
||||
sizeof(kM4VProfileLevels) / sizeof(kM4VProfileLevels[0]);
|
||||
if (index >= nProfileLevels) {
|
||||
return OMX_ErrorNoMore;
|
||||
}
|
||||
|
||||
profileLevel->eProfile = kM4VProfileLevels[index].mProfile;
|
||||
profileLevel->eLevel = kM4VProfileLevels[index].mLevel;
|
||||
}
|
||||
return OMX_ErrorNone;
|
||||
}
|
||||
|
||||
default:
|
||||
return SimpleSoftOMXComponent::internalGetParameter(index, params);
|
||||
}
|
||||
|
||||
@@ -23,10 +23,30 @@
|
||||
#include <media/stagefright/foundation/ADebug.h>
|
||||
#include <media/stagefright/MediaDefs.h>
|
||||
#include <media/stagefright/MediaErrors.h>
|
||||
#include <media/IOMX.h>
|
||||
|
||||
|
||||
namespace android {
|
||||
|
||||
static const CodecProfileLevel kProfileLevels[] = {
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1b },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel11 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel12 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel2 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel21 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel22 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel3 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel31 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel32 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel4 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel41 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel42 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel5 },
|
||||
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel51 },
|
||||
};
|
||||
|
||||
template<class T>
|
||||
static void InitOMXParams(T *params) {
|
||||
params->nSize = sizeof(T);
|
||||
@@ -177,6 +197,28 @@ OMX_ERRORTYPE SoftAVC::internalGetParameter(
|
||||
return OMX_ErrorNone;
|
||||
}
|
||||
|
||||
case OMX_IndexParamVideoProfileLevelQuerySupported:
|
||||
{
|
||||
OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevel =
|
||||
(OMX_VIDEO_PARAM_PROFILELEVELTYPE *) params;
|
||||
|
||||
if (profileLevel->nPortIndex != kInputPortIndex) {
|
||||
LOGE("Invalid port index: %ld", profileLevel->nPortIndex);
|
||||
return OMX_ErrorUnsupportedIndex;
|
||||
}
|
||||
|
||||
size_t index = profileLevel->nProfileIndex;
|
||||
size_t nProfileLevels =
|
||||
sizeof(kProfileLevels) / sizeof(kProfileLevels[0]);
|
||||
if (index >= nProfileLevels) {
|
||||
return OMX_ErrorNoMore;
|
||||
}
|
||||
|
||||
profileLevel->eProfile = kProfileLevels[index].mProfile;
|
||||
profileLevel->eLevel = kProfileLevels[index].mLevel;
|
||||
return OMX_ErrorNone;
|
||||
}
|
||||
|
||||
default:
|
||||
return SimpleSoftOMXComponent::internalGetParameter(index, params);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user