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 Original line Diff line number Diff line
@@ -177,10 +177,6 @@ cc_library {
        "NdkMediaDataSourceCallbacks.cpp",
        "NdkMediaDataSourceCallbacks.cpp",
    ],
    ],


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


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


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


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

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


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


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


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


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


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

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

    if (mData->mAsyncNotify == NULL) {
        mData->mAsyncNotify = new AMessage(kWhatAsyncNotify, mData->mHandler);
        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);
    status_t err = mData->mCodec->setCallback(mData->mAsyncNotify);
    if (err != OK) {
    if (err != OK) {
        ALOGE("setAsyncNotifyCallback: err(%d), failed to set async callback", err);
        ALOGE("setAsyncNotifyCallback: err(%d), failed to set async callback", err);
        return translate_error(err);
        return translate_error(err);
    }
    }
    }


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