android_media_MediaCodec.h revision 7de28d34f1ca3a727a8325cf3304f2fe03d2ac59
188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber/*
288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * Copyright 2012, The Android Open Source Project
388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber *
488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * you may not use this file except in compliance with the License.
688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * You may obtain a copy of the License at
788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber *
888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber *     http://www.apache.org/licenses/LICENSE-2.0
988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber *
1088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * Unless required by applicable law or agreed to in writing, software
1188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * See the License for the specific language governing permissions and
1488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * limitations under the License.
1588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber */
1688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
1788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#ifndef _ANDROID_MEDIA_MEDIACODEC_H_
1888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#define _ANDROID_MEDIA_MEDIACODEC_H_
1988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
2088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include "jni.h"
2188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
229e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber#include <media/hardware/CryptoAPI.h>
2388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/foundation/ABase.h>
24aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber#include <media/stagefright/foundation/AHandler.h>
2588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <utils/Errors.h>
2688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
2788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Hubernamespace android {
2888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
297de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnarstruct ABuffer;
3088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstruct ALooper;
3188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstruct AMessage;
32bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huberstruct AString;
338240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberstruct ICrypto;
34d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFaddenstruct IGraphicBufferProducer;
3588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstruct MediaCodec;
3652800617946c456e78ed010c82d0ec4358368164Mathias Agopianclass Surface;
3788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
38aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huberstruct JMediaCodec : public AHandler {
3988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    JMediaCodec(
4088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            JNIEnv *env, jobject thiz,
4188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            const char *name, bool nameIsType, bool encoder);
4288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
4388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t initCheck() const;
4488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
45aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber    void registerSelf();
46128b012cc8c2369136bb8450bc91c81aebe18506Chong Zhang    void release();
47aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber
488d5e556b2b76278000a506382fdf594c071e1fbdChong Zhang    status_t setCallback(jobject cb);
498d5e556b2b76278000a506382fdf594c071e1fbdChong Zhang
5088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t configure(
5188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            const sp<AMessage> &format,
52d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden            const sp<IGraphicBufferProducer> &bufferProducer,
538240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber            const sp<ICrypto> &crypto,
5488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            int flags);
5588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
562621e40d0e0a496a96575768b7e2b70e3b3be640Andy McFadden    status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer);
572621e40d0e0a496a96575768b7e2b70e3b3be640Andy McFadden
5888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t start();
5988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t stop();
601e6e8018a4f914210b615bfca0f818fd13574228Lajos Molnar    status_t reset();
6188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
6288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t flush();
6388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
6488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t queueInputBuffer(
6588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            size_t index,
66bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber            size_t offset, size_t size, int64_t timeUs, uint32_t flags,
67bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber            AString *errorDetailMsg);
6888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
699e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber    status_t queueSecureInputBuffer(
709e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber            size_t index,
719e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber            size_t offset,
729e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber            const CryptoPlugin::SubSample *subSamples,
739e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber            size_t numSubSamples,
749e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber            const uint8_t key[16],
759e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber            const uint8_t iv[16],
769e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber            CryptoPlugin::Mode mode,
779e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber            int64_t presentationTimeUs,
78bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber            uint32_t flags,
79bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber            AString *errorDetailMsg);
809e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber
8188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs);
8288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
8388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t dequeueOutputBuffer(
8488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            JNIEnv *env, jobject bufferInfo, size_t *index, int64_t timeoutUs);
8588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
867c513b6bef8ed4dfc28e0af6c8594563fdb9f436Lajos Molnar    status_t releaseOutputBuffer(
877c513b6bef8ed4dfc28e0af6c8594563fdb9f436Lajos Molnar            size_t index, bool render, bool updatePTS, int64_t timestampNs);
8888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
892621e40d0e0a496a96575768b7e2b70e3b3be640Andy McFadden    status_t signalEndOfInputStream();
902621e40d0e0a496a96575768b7e2b70e3b3be640Andy McFadden
91d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar    status_t getFormat(JNIEnv *env, bool input, jobject *format) const;
92d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar
93d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar    status_t getOutputFormat(JNIEnv *env, size_t index, jobject *format) const;
9488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
9588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t getBuffers(
9688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            JNIEnv *env, bool input, jobjectArray *bufArray) const;
9788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
98d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar    status_t getBuffer(
99d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar            JNIEnv *env, bool input, size_t index, jobject *buf) const;
100d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar
101d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar    status_t getImage(
102d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar            JNIEnv *env, bool input, size_t index, jobject *image) const;
103d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar
104056ef2ed5ff92b742fe53f2498c596ec1f6bed3cMartin Storsjo    status_t getName(JNIEnv *env, jstring *name) const;
105056ef2ed5ff92b742fe53f2498c596ec1f6bed3cMartin Storsjo
106226065bbe60cf32b33a5f86d27e2db88138e4486Andreas Huber    status_t setParameters(const sp<AMessage> &params);
107226065bbe60cf32b33a5f86d27e2db88138e4486Andreas Huber
108b12a5390694e8525ac61d7377e266e31d124c815Andreas Huber    void setVideoScalingMode(int mode);
109b12a5390694e8525ac61d7377e266e31d124c815Andreas Huber
11088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberprotected:
11188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    virtual ~JMediaCodec();
11288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
113aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
1148d5e556b2b76278000a506382fdf594c071e1fbdChong Zhang    void handleCallback(const sp<AMessage> &msg);
115aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber
11688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberprivate:
117aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber    enum {
1188d5e556b2b76278000a506382fdf594c071e1fbdChong Zhang        kWhatCallbackNotify,
119aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber    };
120aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber
12188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    jclass mClass;
12288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    jweak mObject;
12352800617946c456e78ed010c82d0ec4358368164Mathias Agopian    sp<Surface> mSurfaceTextureClient;
12488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
1257de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar    // java objects cached
1267de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar    jclass mByteBufferClass;
1277de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar    jobject mNativeByteOrderObj;
1287de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar    jmethodID mByteBufferOrderMethodID;
1297de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar    jmethodID mByteBufferPositionMethodID;
1307de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar    jmethodID mByteBufferLimitMethodID;
1317de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar    jmethodID mByteBufferAsReadOnlyBufferMethodID;
1327de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar
13388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<ALooper> mLooper;
13488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<MediaCodec> mCodec;
13588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
1368d5e556b2b76278000a506382fdf594c071e1fbdChong Zhang    sp<AMessage> mCallbackNotification;
137aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber
1387de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar    status_t createByteBufferFromABuffer(
1397de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar            JNIEnv *env, bool readOnly, bool clearBuffer, const sp<ABuffer> &buffer,
1407de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar            jobject *buf) const;
1417de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar
1427de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar    void cacheJavaObjects(JNIEnv *env);
1437de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar    void deleteJavaObjects(JNIEnv *env);
1447de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar
14588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(JMediaCodec);
14688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber};
14788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
14888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}  // namespace android
14988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
15088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#endif  // _ANDROID_MEDIA_MEDIACODEC_H_
151