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

Commit 4e5af24f authored by Ray Essick's avatar Ray Essick
Browse files

Validate ndkmediacodec callback pointers before use

Verify that the async callback function pointers are non-null before use.
Rework callback setting to allow retrigger after a release/configure cycle.

Bug: 205335443
Bug: 152553625
Bug: 203147387
Test: atest android.mediav2.cts.CodecUnitTest
Change-Id: I536575f280c714b6a702af3b48a410f6d9a7a924
parent 2a6af36c
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -177,10 +177,6 @@ cc_library {
        "NdkMediaDataSourceCallbacks.cpp",
    ],

    include_dirs: [
        "frameworks/av/media/libstagefright/include",
        "frameworks/av/media/ndk/include",
    ],

    export_include_dirs: [
        "include",
@@ -193,6 +189,7 @@ cc_library {
    ],

    header_libs: [
        "libstagefright_headers",
        "libmedia_headers",
    ],

@@ -223,6 +220,7 @@ cc_test {
        "libcutils",
        "android.hardware.graphics.bufferqueue@1.0",
    ],

    header_libs: [
        "libstagefright_foundation_headers",
    ],
@@ -230,9 +228,6 @@ cc_test {
    cflags: [
        "-D__ANDROID_VNDK__",
    ],
    include_dirs: [
        "frameworks/av/media/ndk/",
    ],
}

cc_library_static {
+15 −15
Original line number Diff line number Diff line
@@ -158,8 +158,7 @@ void CodecHandler::onMessageReceived(const sp<AMessage> &msg) {
                     }

                     Mutex::Autolock _l(mCodec->mAsyncCallbackLock);
                     if (mCodec->mAsyncCallbackUserData != NULL
                         || mCodec->mAsyncCallback.onAsyncInputAvailable != NULL) {
                     if (mCodec->mAsyncCallback.onAsyncInputAvailable != NULL) {
                         mCodec->mAsyncCallback.onAsyncInputAvailable(
                                 mCodec,
                                 mCodec->mAsyncCallbackUserData,
@@ -205,8 +204,7 @@ void CodecHandler::onMessageReceived(const sp<AMessage> &msg) {
                         (uint32_t)flags};

                     Mutex::Autolock _l(mCodec->mAsyncCallbackLock);
                     if (mCodec->mAsyncCallbackUserData != NULL
                         || mCodec->mAsyncCallback.onAsyncOutputAvailable != NULL) {
                     if (mCodec->mAsyncCallback.onAsyncOutputAvailable != NULL) {
                         mCodec->mAsyncCallback.onAsyncOutputAvailable(
                                 mCodec,
                                 mCodec->mAsyncCallbackUserData,
@@ -234,8 +232,7 @@ void CodecHandler::onMessageReceived(const sp<AMessage> &msg) {
                     AMediaFormat *aMediaFormat = AMediaFormat_fromMsg(&copy);

                     Mutex::Autolock _l(mCodec->mAsyncCallbackLock);
                     if (mCodec->mAsyncCallbackUserData != NULL
                         || mCodec->mAsyncCallback.onAsyncFormatChanged != NULL) {
                     if (mCodec->mAsyncCallback.onAsyncFormatChanged != NULL) {
                         mCodec->mAsyncCallback.onAsyncFormatChanged(
                                 mCodec,
                                 mCodec->mAsyncCallbackUserData,
@@ -263,8 +260,7 @@ void CodecHandler::onMessageReceived(const sp<AMessage> &msg) {
                           err, actionCode, detail.c_str());

                     Mutex::Autolock _l(mCodec->mAsyncCallbackLock);
                     if (mCodec->mAsyncCallbackUserData != NULL
                         || mCodec->mAsyncCallback.onAsyncError != NULL) {
                     if (mCodec->mAsyncCallback.onAsyncError != NULL) {
                         mCodec->mAsyncCallback.onAsyncError(
                                 mCodec,
                                 mCodec->mAsyncCallbackUserData,
@@ -474,16 +470,20 @@ media_status_t AMediaCodec_setAsyncNotifyCallback(
        AMediaCodec *mData,
        AMediaCodecOnAsyncNotifyCallback callback,
        void *userdata) {
    if (mData->mAsyncNotify == NULL && userdata != NULL) {

    Mutex::Autolock _l(mData->mAsyncCallbackLock);

    if (mData->mAsyncNotify == NULL) {
        mData->mAsyncNotify = new AMessage(kWhatAsyncNotify, mData->mHandler);
    }

    // always call, codec may have been reset/re-configured since last call.
    status_t err = mData->mCodec->setCallback(mData->mAsyncNotify);
    if (err != OK) {
        ALOGE("setAsyncNotifyCallback: err(%d), failed to set async callback", err);
        return translate_error(err);
    }
    }

    Mutex::Autolock _l(mData->mAsyncCallbackLock);
    mData->mAsyncCallback = callback;
    mData->mAsyncCallbackUserData = userdata;