Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 064b46ea authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Add APV codec support to Platform muxer" into main am: 494d36a9

parents 3d44e75e 494d36a9
Loading
Loading
Loading
Loading
+25 −1
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@
#include "include/HevcUtils.h"

#include <com_android_media_editing_flags.h>
namespace editing_flags = com::android::media::editing::flags;

#ifndef __predict_false
#define __predict_false(exp) __builtin_expect((exp) != 0, 0)
@@ -160,6 +161,7 @@ public:
    bool isAvc() const { return mIsAvc; }
    bool isHevc() const { return mIsHevc; }
    bool isAv1() const { return mIsAv1; }
    bool isApv() const { return mIsApv; }
    bool isHeic() const { return mIsHeic; }
    bool isAvif() const { return mIsAvif; }
    bool isHeif() const { return mIsHeif; }
@@ -328,6 +330,7 @@ private:
    bool mIsAvc;
    bool mIsHevc;
    bool mIsAv1;
    bool mIsApv;
    bool mIsDovi;
    bool mIsAudio;
    bool mIsVideo;
@@ -479,6 +482,7 @@ private:
    void writeAvccBox();
    void writeHvccBox();
    void writeAv1cBox();
    void writeApvcBox();
    void writeDoviConfigBox();
    void writeUrlBox();
    void writeDrefBox();
@@ -680,6 +684,9 @@ const char *MPEG4Writer::Track::getFourCCForMime(const char *mime) {
            return "hvc1";
        } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_AV1, mime)) {
            return "av01";
        } else if (editing_flags::muxer_mp4_enable_apv() &&
                   !strcasecmp(MEDIA_MIMETYPE_VIDEO_APV, mime)) {
            return "apv1";
        }
    } else if (!strncasecmp(mime, "application/", 12)) {
        return "mett";
@@ -2266,6 +2273,7 @@ MPEG4Writer::Track::Track(
    mIsAvc = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC);
    mIsHevc = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_HEVC);
    mIsAv1 = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AV1);
    mIsApv = editing_flags::muxer_mp4_enable_apv() && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_APV);
    mIsDovi = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_DOLBY_VISION);
    mIsAudio = !strncasecmp(mime, "audio/", 6);
    mIsVideo = !strncasecmp(mime, "video/", 6);
@@ -2708,6 +2716,9 @@ void MPEG4Writer::Track::getCodecSpecificDataFromInputFormatIfPossible() {
    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AV1) ||
               !strcasecmp(mime, MEDIA_MIMETYPE_IMAGE_AVIF)) {
        mMeta->findData(kKeyAV1C, &type, &data, &size);
    } else if (editing_flags::muxer_mp4_enable_apv() &&
               !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_APV)) {
        mMeta->findData(kKeyAPVC, &type, &data, &size);
    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_DOLBY_VISION)) {
        getDolbyVisionProfile();
        if (!mMeta->findData(kKeyAVCC, &type, &data, &size) &&
@@ -3609,7 +3620,7 @@ status_t MPEG4Writer::Track::threadEntry() {
                            (const uint8_t *)buffer->data()
                                + buffer->range_offset(),
                            buffer->range_length());
                } else if (mIsMPEG4 || mIsAv1) {
                } else if (mIsMPEG4 || mIsAv1 || mIsApv) {
                    err = copyCodecSpecificData((const uint8_t *)buffer->data() + buffer->range_offset(),
                            buffer->range_length());
                }
@@ -4338,6 +4349,7 @@ status_t MPEG4Writer::Track::checkCodecSpecificData() const {
        !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime) ||
        !strcasecmp(MEDIA_MIMETYPE_VIDEO_HEVC, mime) ||
        !strcasecmp(MEDIA_MIMETYPE_VIDEO_AV1, mime) ||
        (editing_flags::muxer_mp4_enable_apv() && !strcasecmp(MEDIA_MIMETYPE_VIDEO_APV, mime)) ||
        !strcasecmp(MEDIA_MIMETYPE_VIDEO_DOLBY_VISION, mime) ||
        !strcasecmp(MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC, mime) ||
        !strcasecmp(MEDIA_MIMETYPE_IMAGE_AVIF, mime)) {
@@ -4512,6 +4524,9 @@ void MPEG4Writer::Track::writeVideoFourCCBox() {
        writeHvccBox();
    } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_AV1, mime)) {
        writeAv1cBox();
    } else if (editing_flags::muxer_mp4_enable_apv() &&
               !strcasecmp(MEDIA_MIMETYPE_VIDEO_APV, mime)) {
        writeApvcBox();
    } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_DOLBY_VISION, mime)) {
        if (mDoviProfile <= DolbyVisionProfileDvheSt) {
            writeHvccBox();
@@ -5103,6 +5118,15 @@ void MPEG4Writer::Track::writeAv1cBox() {
    mOwner->endBox();  // av1C
}

void MPEG4Writer::Track::writeApvcBox() {
    CHECK(mCodecSpecificData);
    CHECK_GE(mCodecSpecificDataSize, 4u);

    mOwner->beginBox("apvC");
    mOwner->write(mCodecSpecificData, mCodecSpecificDataSize);
    mOwner->endBox();  // apvC
}

void MPEG4Writer::Track::writeDoviConfigBox() {
    CHECK_NE(mDoviProfile, 0u);

+1 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ enum {
    kKeyDVVC              = 'dvvc',  // raw data
    kKeyDVWC              = 'dvwc',  // raw data
    kKeyAV1C              = 'av1c',  // raw data
    kKeyAPVC              = 'apvc',  // raw data
    kKeyThumbnailHVCC     = 'thvc',  // raw data
    kKeyThumbnailAV1C     = 'tav1',  // raw data
    kKeyD263              = 'd263',  // raw data