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

Commit e2a2dfcb authored by Chong Zhang's avatar Chong Zhang
Browse files

MediaRecorder: implement persistent input surface APIs

Bug: 19127604
Bug: 19489395

Change-Id: I7dd8015a8fe029f9867fcdb52322629c77eff50b
parent d291c222
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ class Surface;
class ICamera;
class ICameraRecordingProxy;
class IMediaRecorderClient;
class IGraphicBufferConsumer;
class IGraphicBufferProducer;

class IMediaRecorder: public IInterface
@@ -55,6 +56,7 @@ public:
    virtual status_t init() = 0;
    virtual status_t close() = 0;
    virtual status_t release() = 0;
    virtual status_t usePersistentSurface(const sp<IGraphicBufferConsumer>& surface) = 0;
    virtual sp<IGraphicBufferProducer> querySurfaceMediaSource() = 0;
};

+2 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ namespace android {

class ICameraRecordingProxy;
class Surface;
class IGraphicBufferConsumer;
class IGraphicBufferProducer;

struct MediaRecorderBase {
@@ -56,6 +57,7 @@ struct MediaRecorderBase {
    virtual status_t reset() = 0;
    virtual status_t getMaxAmplitude(int *max) = 0;
    virtual status_t dump(int fd, const Vector<String16>& args) const = 0;
    virtual status_t usePersistentSurface(const sp<IGraphicBufferConsumer>& surface) = 0;
    virtual sp<IGraphicBufferProducer> querySurfaceMediaSource() const = 0;


+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ class IMediaRecorder;
class ICamera;
class ICameraRecordingProxy;
class IGraphicBufferProducer;
struct PersistentSurface;
class Surface;

typedef void (*media_completion_f)(status_t status, void *cookie);
@@ -236,6 +237,7 @@ public:
    status_t    close();
    status_t    release();
    void        notify(int msg, int ext1, int ext2);
    status_t    usePersistentSurface(const sp<PersistentSurface>& surface);
    sp<IGraphicBufferProducer>     querySurfaceMediaSourceFromMediaServer();

private:
+4 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ struct ALooper;
class AMessage;
struct AReplyToken;
class IGraphicBufferProducer;
class IGraphicBufferConsumer;
class MediaCodec;
class MetaData;

@@ -41,6 +42,7 @@ struct MediaCodecSource : public MediaSource,
            const sp<ALooper> &looper,
            const sp<AMessage> &format,
            const sp<MediaSource> &source,
            const sp<IGraphicBufferConsumer> &consumer = NULL,
            uint32_t flags = 0);

    bool isVideo() const { return mIsVideo; }
@@ -79,6 +81,7 @@ private:
            const sp<ALooper> &looper,
            const sp<AMessage> &outputFormat,
            const sp<MediaSource> &source,
            const sp<IGraphicBufferConsumer> &consumer,
            uint32_t flags = 0);

    status_t onStart(MetaData *params);
@@ -107,6 +110,7 @@ private:
    bool mDoMoreWorkPending;
    sp<AMessage> mEncoderActivityNotify;
    sp<IGraphicBufferProducer> mGraphicBufferProducer;
    sp<IGraphicBufferConsumer> mGraphicBufferConsumer;
    List<MediaBuffer *> mInputBufferQueue;
    List<size_t> mAvailEncoderInputIndices;
    List<int64_t> mDecodingTimeQueue; // decoding time (us) for video
+19 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ enum {
    RELEASE = IBinder::FIRST_CALL_TRANSACTION,
    INIT,
    CLOSE,
    USE_PERSISTENT_SURFACE,
    QUERY_SURFACE_MEDIASOURCE,
    RESET,
    STOP,
@@ -75,6 +76,16 @@ public:
        return reply.readInt32();
    }

    status_t usePersistentSurface(const sp<IGraphicBufferConsumer>& surface)
    {
        ALOGV("usePersistentSurface(%p)", surface.get());
        Parcel data, reply;
        data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
        data.writeStrongBinder(IInterface::asBinder(surface));
        remote()->transact(USE_PERSISTENT_SURFACE, data, &reply);
        return reply.readInt32();
    }

    sp<IGraphicBufferProducer> querySurfaceMediaSource()
    {
        ALOGV("Query SurfaceMediaSource");
@@ -442,6 +453,14 @@ status_t BnMediaRecorder::onTransact(
            reply->writeInt32(setCamera(camera, proxy));
            return NO_ERROR;
        } break;
        case USE_PERSISTENT_SURFACE: {
            ALOGV("USE_PERSISTENT_SURFACE");
            CHECK_INTERFACE(IMediaRecorder, data, reply);
            sp<IGraphicBufferConsumer> surface = interface_cast<IGraphicBufferConsumer>(
                    data.readStrongBinder());
            reply->writeInt32(usePersistentSurface(surface));
            return NO_ERROR;
        } break;
        case QUERY_SURFACE_MEDIASOURCE: {
            ALOGV("QUERY_SURFACE_MEDIASOURCE");
            CHECK_INTERFACE(IMediaRecorder, data, reply);
Loading