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

Commit 2d3dcac1 authored by Andreas Huber's avatar Andreas Huber Committed by Android Git Automerger
Browse files

am d51c2cac: am 45bac57a: Support for writing the extracted data to an .mp4...

am d51c2cac: am 45bac57a: Support for writing the extracted data to an .mp4 file in the stagefright commandline tool.

Merge commit 'd51c2cac'

* commit 'd51c2cac':
  Support for writing the extracted data to an .mp4 file in the stagefright commandline tool.
parents 06abd91d d51c2cac
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -7,7 +7,7 @@ LOCAL_SRC_FILES:= \
	SineSource.cpp
	SineSource.cpp


LOCAL_SHARED_LIBRARIES := \
LOCAL_SHARED_LIBRARIES := \
	libstagefright libmedia libutils libbinder
	libstagefright libmedia libutils libbinder libstagefright_foundation


LOCAL_C_INCLUDES:= \
LOCAL_C_INCLUDES:= \
	$(JNI_H_INCLUDE) \
	$(JNI_H_INCLUDE) \
+35 −2
Original line number Original line Diff line number Diff line
@@ -38,6 +38,9 @@
#include <media/stagefright/OMXCodec.h>
#include <media/stagefright/OMXCodec.h>
#include <media/mediametadataretriever.h>
#include <media/mediametadataretriever.h>


#include <media/stagefright/foundation/hexdump.h>
#include <media/stagefright/MPEG4Writer.h>

using namespace android;
using namespace android;


static long gNumRepetitions;
static long gNumRepetitions;
@@ -45,6 +48,8 @@ static long gMaxNumFrames; // 0 means decode all available.
static long gReproduceBug;  // if not -1.
static long gReproduceBug;  // if not -1.
static bool gPreferSoftwareCodec;
static bool gPreferSoftwareCodec;
static bool gPlaybackAudio;
static bool gPlaybackAudio;
static bool gWriteMP4;
static String8 gWriteMP4Filename;


static int64_t getNowUs() {
static int64_t getNowUs() {
    struct timeval tv;
    struct timeval tv;
@@ -258,6 +263,21 @@ static void playSource(OMXClient *client, const sp<MediaSource> &source) {
    }
    }
}
}


static void writeSourceToMP4(const sp<MediaSource> &source) {
    sp<MPEG4Writer> writer =
        new MPEG4Writer(gWriteMP4Filename.string());

    CHECK_EQ(writer->addSource(source), OK);

    sp<MetaData> params = new MetaData;
    CHECK_EQ(writer->start(), OK);

    while (!writer->reachedEOS()) {
        usleep(100000);
    }
    writer->stop();
}

static void usage(const char *me) {
static void usage(const char *me) {
    fprintf(stderr, "usage: %s\n", me);
    fprintf(stderr, "usage: %s\n", me);
    fprintf(stderr, "       -h(elp)\n");
    fprintf(stderr, "       -h(elp)\n");
@@ -270,6 +290,7 @@ static void usage(const char *me) {
    fprintf(stderr, "       -t(humbnail) extract video thumbnail or album art\n");
    fprintf(stderr, "       -t(humbnail) extract video thumbnail or album art\n");
    fprintf(stderr, "       -s(oftware) prefer software codec\n");
    fprintf(stderr, "       -s(oftware) prefer software codec\n");
    fprintf(stderr, "       -o playback audio\n");
    fprintf(stderr, "       -o playback audio\n");
    fprintf(stderr, "       -w(rite) filename (write to .mp4 file)\n");
}
}


int main(int argc, char **argv) {
int main(int argc, char **argv) {
@@ -284,9 +305,10 @@ int main(int argc, char **argv) {
    gReproduceBug = -1;
    gReproduceBug = -1;
    gPreferSoftwareCodec = false;
    gPreferSoftwareCodec = false;
    gPlaybackAudio = false;
    gPlaybackAudio = false;
    gWriteMP4 = false;


    int res;
    int res;
    while ((res = getopt(argc, argv, "han:lm:b:ptso")) >= 0) {
    while ((res = getopt(argc, argv, "han:lm:b:ptsow:")) >= 0) {
        switch (res) {
        switch (res) {
            case 'a':
            case 'a':
            {
            {
@@ -322,6 +344,13 @@ int main(int argc, char **argv) {
                break;
                break;
            }
            }


            case 'w':
            {
                gWriteMP4 = true;
                gWriteMP4Filename.setTo(optarg);
                break;
            }

            case 'p':
            case 'p':
            {
            {
                dumpProfiles = true;
                dumpProfiles = true;
@@ -554,8 +583,12 @@ int main(int argc, char **argv) {
            mediaSource = extractor->getTrack(i);
            mediaSource = extractor->getTrack(i);
        }
        }


        if (gWriteMP4) {
            writeSourceToMP4(mediaSource);
        } else {
            playSource(&client, mediaSource);
            playSource(&client, mediaSource);
        }
        }
    }


    client.disconnect();
    client.disconnect();


+4 −1
Original line number Original line Diff line number Diff line
@@ -27,7 +27,10 @@ struct MediaSource;
struct MetaData;
struct MetaData;


struct MediaWriter : public RefBase {
struct MediaWriter : public RefBase {
    MediaWriter() {}
    MediaWriter()
        : mMaxFileSizeLimitBytes(0),
          mMaxFileDurationLimitUs(0) {
    }


    virtual status_t addSource(const sp<MediaSource> &source) = 0;
    virtual status_t addSource(const sp<MediaSource> &source) = 0;
    virtual bool reachedEOS() = 0;
    virtual bool reachedEOS() = 0;
+40 −1
Original line number Original line Diff line number Diff line
@@ -34,6 +34,8 @@
#include <media/mediarecorder.h>
#include <media/mediarecorder.h>
#include <cutils/properties.h>
#include <cutils/properties.h>


#include "include/ESDS.h"

namespace android {
namespace android {


class MPEG4Writer::Track {
class MPEG4Writer::Track {
@@ -126,6 +128,8 @@ private:
            int32_t *min, int32_t *avg, int32_t *max);
            int32_t *min, int32_t *avg, int32_t *max);
    void findMinMaxChunkDurations(int64_t *min, int64_t *max);
    void findMinMaxChunkDurations(int64_t *min, int64_t *max);


    void getCodecSpecificDataFromInputFormatIfPossible();

    Track(const Track &);
    Track(const Track &);
    Track &operator=(const Track &);
    Track &operator=(const Track &);
};
};
@@ -678,6 +682,38 @@ MPEG4Writer::Track::Track(
      mCodecSpecificDataSize(0),
      mCodecSpecificDataSize(0),
      mGotAllCodecSpecificData(false),
      mGotAllCodecSpecificData(false),
      mReachedEOS(false) {
      mReachedEOS(false) {
    getCodecSpecificDataFromInputFormatIfPossible();
}

void MPEG4Writer::Track::getCodecSpecificDataFromInputFormatIfPossible() {
    const char *mime;
    CHECK(mMeta->findCString(kKeyMIMEType, &mime));

    if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
        uint32_t type;
        const void *data;
        size_t size;
        if (mMeta->findData(kKeyAVCC, &type, &data, &size)) {
            mCodecSpecificData = malloc(size);
            mCodecSpecificDataSize = size;
            memcpy(mCodecSpecificData, data, size);
            mGotAllCodecSpecificData = true;
        }
    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4)
            || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
        uint32_t type;
        const void *data;
        size_t size;
        if (mMeta->findData(kKeyESDS, &type, &data, &size)) {
            ESDS esds(data, size);
            if (esds.getCodecSpecificInfo(&data, &size) == OK) {
                mCodecSpecificData = malloc(size);
                mCodecSpecificDataSize = size;
                memcpy(mCodecSpecificData, data, size);
                mGotAllCodecSpecificData = true;
            }
        }
    }
}
}


MPEG4Writer::Track::~Track() {
MPEG4Writer::Track::~Track() {
@@ -721,7 +757,10 @@ status_t MPEG4Writer::Track::start(MetaData *params) {
    }
    }


    int64_t startTimeUs;
    int64_t startTimeUs;
    CHECK(params && params->findInt64(kKeyTime, &startTimeUs));
    if (params == NULL || !params->findInt64(kKeyTime, &startTimeUs)) {
        startTimeUs = 0;
    }

    initTrackingProgressStatus(params);
    initTrackingProgressStatus(params);


    sp<MetaData> meta = new MetaData;
    sp<MetaData> meta = new MetaData;