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

Commit 312644cd authored by Andreas Huber's avatar Andreas Huber Committed by Android (Google) Code Review
Browse files

Merge "Support for writing to MPEG2 transport stream files." into gingerbread

parents 165c6579 9adf4660
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -76,6 +76,9 @@ enum output_format {
    /* Stream over a socket, limited to a single stream */
    OUTPUT_FORMAT_RTP_AVP = 7,

    /* H.264/AAC data encapsulated in MPEG2/TS */
    OUTPUT_FORMAT_MPEG2TS = 8,

    OUTPUT_FORMAT_LIST_END // must be last - used to validate format type
};

+5 −0
Original line number Diff line number Diff line
@@ -25,7 +25,10 @@

namespace android {

struct ABuffer;

struct MPEG2TSWriter : public MediaWriter {
    MPEG2TSWriter(int fd);
    MPEG2TSWriter(const char *filename);

    virtual status_t addSource(const sp<MediaSource> &source);
@@ -59,6 +62,8 @@ private:
    int64_t mNumTSPacketsWritten;
    int64_t mNumTSPacketsBeforeMeta;

    void init();

    void writeTS();
    void writeProgramAssociationTable();
    void writeProgramMap();
+3 −0
Original line number Diff line number Diff line
@@ -191,6 +191,9 @@ public class MediaRecorder

        /** @hide Stream over a socket, limited to a single stream */
        public static final int OUTPUT_FORMAT_RTP_AVP = 7;

        /** @hide H.264/AAC data encapsulated in MPEG2/TS */
        public static final int OUTPUT_FORMAT_MPEG2TS = 8;
    };

    /**
+1 −1
Original line number Diff line number Diff line
@@ -181,7 +181,7 @@ status_t MediaRecorder::setOutputFormat(int of)
        LOGE("setOutputFormat called in an invalid state: %d", mCurrentState);
        return INVALID_OPERATION;
    }
    if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_AUDIO_ONLY_START && of != OUTPUT_FORMAT_RTP_AVP) { //first non-video output format
    if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_AUDIO_ONLY_START && of != OUTPUT_FORMAT_RTP_AVP && of != OUTPUT_FORMAT_MPEG2TS) { //first non-video output format
        LOGE("output format (%d) is meant for audio recording only and incompatible with video recording", of);
        return INVALID_OPERATION;
    }
+50 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <media/stagefright/AudioSource.h>
#include <media/stagefright/AMRWriter.h>
#include <media/stagefright/CameraSource.h>
#include <media/stagefright/MPEG2TSWriter.h>
#include <media/stagefright/MPEG4Writer.h>
#include <media/stagefright/MediaDebug.h>
#include <media/stagefright/MediaDefs.h>
@@ -632,6 +633,9 @@ status_t StagefrightRecorder::start() {
        case OUTPUT_FORMAT_RTP_AVP:
            return startRTPRecording();

        case OUTPUT_FORMAT_MPEG2TS:
            return startMPEG2TSRecording();

        default:
            LOGE("Unsupported output file format: %d", mOutputFormat);
            return UNKNOWN_ERROR;
@@ -799,6 +803,52 @@ status_t StagefrightRecorder::startRTPRecording() {
    return mWriter->start();
}

status_t StagefrightRecorder::startMPEG2TSRecording() {
    CHECK_EQ(mOutputFormat, OUTPUT_FORMAT_MPEG2TS);

    sp<MediaWriter> writer = new MPEG2TSWriter(dup(mOutputFd));

    if (mAudioSource != AUDIO_SOURCE_LIST_END) {
        if (mAudioEncoder != AUDIO_ENCODER_AAC) {
            return ERROR_UNSUPPORTED;
        }

        status_t err = setupAudioEncoder(writer);

        if (err != OK) {
            return err;
        }
    }

    if (mVideoSource == VIDEO_SOURCE_DEFAULT
            || mVideoSource == VIDEO_SOURCE_CAMERA) {
        if (mVideoEncoder != VIDEO_ENCODER_H264) {
            return ERROR_UNSUPPORTED;
        }

        sp<MediaSource> encoder;
        status_t err = setupVideoEncoder(&encoder);

        if (err != OK) {
            return err;
        }

        writer->addSource(encoder);
    }

    if (mMaxFileDurationUs != 0) {
        writer->setMaxFileDuration(mMaxFileDurationUs);
    }

    if (mMaxFileSizeBytes != 0) {
        writer->setMaxFileSize(mMaxFileSizeBytes);
    }

    mWriter = writer;

    return mWriter->start();
}

void StagefrightRecorder::clipVideoFrameRate() {
    LOGV("clipVideoFrameRate: encoder %d", mVideoEncoder);
    int minFrameRate = mEncoderProfiles->getVideoEncoderParamByName(
Loading