diff options
| -rw-r--r-- | include/media/MediaProfiles.h | 26 | ||||
| -rw-r--r-- | media/libmedia/MediaProfiles.cpp | 59 | 
2 files changed, 84 insertions, 1 deletions
diff --git a/include/media/MediaProfiles.h b/include/media/MediaProfiles.h index 69d5001..4b023d1 100644 --- a/include/media/MediaProfiles.h +++ b/include/media/MediaProfiles.h @@ -140,6 +140,19 @@ public:      int getVideoEditorCapParamByName(const char *name) const;      /** +     * Returns the value for the given param name for the video editor export codec format +     * param or -1 if error. +     * Supported param name are: +     * videoeditor.export.profile - export video profile +     * videoeditor.export.level - export video level +     * Supported param codec are: +     * 1 for h263 +     * 2 for h264 +     * 3 for mpeg4 +     */ +    int getVideoEditorExportParamByName(const char *name, int codec) const; + +    /**       * Returns the audio encoders supported.       */      Vector<audio_encoder> getAudioEncoders() const; @@ -332,7 +345,14 @@ private:          int mCameraId;          Vector<int> mLevels;      }; - +    struct ExportVideoProfile { +        ExportVideoProfile(int codec, int profile, int level) +            :mCodec(codec),mProfile(profile),mLevel(level) {} +        ~ExportVideoProfile() {} +        int mCodec; +        int mProfile; +        int mLevel; +    };      struct VideoEditorCap {          VideoEditorCap(int inFrameWidth, int inFrameHeight,              int outFrameWidth, int outFrameHeight) @@ -374,6 +394,7 @@ private:      static AudioEncoderCap* createAudioEncoderCap(const char **atts);      static VideoEditorCap* createVideoEditorCap(                  const char **atts, MediaProfiles *profiles); +    static ExportVideoProfile* createExportVideoProfile(const char **atts);      static CamcorderProfile* createCamcorderProfile(                  int cameraId, const char **atts, Vector<int>& cameraIds); @@ -418,6 +439,8 @@ private:      static void createDefaultImageEncodingQualityLevels(MediaProfiles *profiles);      static void createDefaultImageDecodingMaxMemory(MediaProfiles *profiles);      static void createDefaultVideoEditorCap(MediaProfiles *profiles); +    static void createDefaultExportVideoProfiles(MediaProfiles *profiles); +      static VideoEncoderCap* createDefaultH263VideoEncoderCap();      static VideoEncoderCap* createDefaultM4vVideoEncoderCap();      static AudioEncoderCap* createDefaultAmrNBEncoderCap(); @@ -475,6 +498,7 @@ private:      RequiredProfiles *mRequiredProfileRefs;      Vector<int>              mCameraIds;      VideoEditorCap* mVideoEditorCap; +    Vector<ExportVideoProfile*> mVideoEditorExportProfiles;  };  }; // namespace android diff --git a/media/libmedia/MediaProfiles.cpp b/media/libmedia/MediaProfiles.cpp index f0f07a2..5a8bc60 100644 --- a/media/libmedia/MediaProfiles.cpp +++ b/media/libmedia/MediaProfiles.cpp @@ -26,6 +26,7 @@  #include <expat.h>  #include <media/MediaProfiles.h>  #include <media/stagefright/MediaDebug.h> +#include <media/stagefright/openmax/OMX_Video.h>  namespace android { @@ -377,7 +378,24 @@ void MediaProfiles::addStartTimeOffset(int cameraId, const char** atts)      LOGV("%s: cameraId=%d, offset=%d ms", __func__, cameraId, offsetTimeMs);      mStartTimeOffsets.replaceValueFor(cameraId, offsetTimeMs);  } +/*static*/ MediaProfiles::ExportVideoProfile* +MediaProfiles::createExportVideoProfile(const char **atts) +{ +    CHECK(!strcmp("name", atts[0]) && +          !strcmp("profile", atts[2]) && +          !strcmp("level", atts[4])); + +    const size_t nMappings = +        sizeof(sVideoEncoderNameMap)/sizeof(sVideoEncoderNameMap[0]); +    const int codec = findTagForName(sVideoEncoderNameMap, nMappings, atts[1]); +    CHECK(codec != -1); + +    MediaProfiles::ExportVideoProfile *profile = +        new MediaProfiles::ExportVideoProfile( +            codec, atoi(atts[3]), atoi(atts[5])); +    return profile; +}  /*static*/ MediaProfiles::VideoEditorCap*  MediaProfiles::createVideoEditorCap(const char **atts, MediaProfiles *profiles)  { @@ -428,6 +446,8 @@ MediaProfiles::startElementHandler(void *userData, const char *name, const char          profiles->addImageEncodingQualityLevel(profiles->mCurrentCameraId, atts);      } else if (strcmp("VideoEditorCap", name) == 0) {          createVideoEditorCap(atts, profiles); +    } else if (strcmp("ExportVideoProfile", name) == 0) { +        profiles->mVideoEditorExportProfiles.add(createExportVideoProfile(atts));      }  } @@ -830,6 +850,20 @@ MediaProfiles::createDefaultVideoEditorCap(MediaProfiles *profiles)                  VIDEOEDITOR_DEFAULT_MAX_OUTPUT_FRAME_WIDTH,                  VIDEOEDITOR_DEFUALT_MAX_OUTPUT_FRAME_HEIGHT);  } +/*static*/ void +MediaProfiles::createDefaultExportVideoProfiles(MediaProfiles *profiles) +{ +    // Create default video export profiles +    profiles->mVideoEditorExportProfiles.add( +        new ExportVideoProfile(VIDEO_ENCODER_H263, +            OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level10)); +    profiles->mVideoEditorExportProfiles.add( +        new ExportVideoProfile(VIDEO_ENCODER_MPEG_4_SP, +            OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1)); +    profiles->mVideoEditorExportProfiles.add( +        new ExportVideoProfile(VIDEO_ENCODER_H264, +            OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13)); +}  /*static*/ MediaProfiles*  MediaProfiles::createDefaultInstance() @@ -843,6 +877,7 @@ MediaProfiles::createDefaultInstance()      createDefaultEncoderOutputFileFormats(profiles);      createDefaultImageEncodingQualityLevels(profiles);      createDefaultVideoEditorCap(profiles); +    createDefaultExportVideoProfiles(profiles);      return profiles;  } @@ -940,7 +975,31 @@ int MediaProfiles::getVideoEncoderParamByName(const char *name, video_encoder co      LOGE("The given video encoder param name %s is not found", name);      return -1;  } +int MediaProfiles::getVideoEditorExportParamByName( +    const char *name, int codec) const +{ +    LOGV("getVideoEditorExportParamByName: name %s codec %d", name, codec); +    ExportVideoProfile *exportProfile = NULL; +    int index = -1; +    for (size_t i =0; i < mVideoEditorExportProfiles.size(); i++) { +        exportProfile = mVideoEditorExportProfiles[i]; +        if (exportProfile->mCodec == codec) { +            index = i; +            break; +        } +    } +    if (index == -1) { +        LOGE("The given video decoder %d is not found", codec); +        return -1; +    } +    if (!strcmp("videoeditor.export.profile", name)) +        return exportProfile->mProfile; +    if (!strcmp("videoeditor.export.level", name)) +        return exportProfile->mLevel; +    LOGE("The given video editor export param name %s is not found", name); +    return -1; +}  int MediaProfiles::getVideoEditorCapParamByName(const char *name) const  {      LOGV("getVideoEditorCapParamByName: %s", name);  | 
