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

Commit a8385dd7 authored by Andreas Huber's avatar Andreas Huber
Browse files

Support non-multiple-of-16 dimensions in MPEG4/H.263 software decoder

Change-Id: Ia22ebce66d9c35de4b04c3eedc9495847796901d
related-to-bug: 3384367
parent da6f9295
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -23,8 +23,8 @@
#include "mp4dec_api.h"

#include <OMX_Component.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/MediaBufferGroup.h>
#include <media/stagefright/MediaDebug.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MetaData.h>
@@ -106,7 +106,7 @@ status_t M4vH263Decoder::start(MetaData *) {
    int32_t vol_size = 0;
    if (meta->findData(kKeyESDS, &type, &data, &size)) {
        ESDS esds((const uint8_t *)data, size);
        CHECK_EQ(esds.InitCheck(), OK);
        CHECK_EQ(esds.InitCheck(), (status_t)OK);

        const void *codec_specific_data;
        size_t codec_specific_data_size;
@@ -185,7 +185,7 @@ status_t M4vH263Decoder::read(
    ReadOptions::SeekMode mode;
    if (options && options->getSeekTo(&seekTimeUs, &mode)) {
        seeking = true;
        CHECK_EQ(PVResetVideoDecoder(mHandle), PV_TRUE);
        CHECK_EQ((int)PVResetVideoDecoder(mHandle), PV_TRUE);
    }

    MediaBuffer *inputBuffer = NULL;
@@ -223,19 +223,28 @@ status_t M4vH263Decoder::read(
        return UNKNOWN_ERROR;
    }

    int32_t width, height;
    PVGetVideoDimensions(mHandle, &width, &height);
    if (width != mWidth || height != mHeight) {
    int32_t disp_width, disp_height;
    PVGetVideoDimensions(mHandle, &disp_width, &disp_height);

    int32_t buf_width, buf_height;
    PVGetBufferDimensions(mHandle, &buf_width, &buf_height);

    if (buf_width != mWidth || buf_height != mHeight) {
        ++mNumSamplesOutput;  // The client will never get to see this frame.

        inputBuffer->release();
        inputBuffer = NULL;

        mWidth = width;
        mHeight = height;
        mWidth = buf_width;
        mHeight = buf_height;
        mFormat->setInt32(kKeyWidth, mWidth);
        mFormat->setInt32(kKeyHeight, mHeight);

        CHECK_LE(disp_width, buf_width);
        CHECK_LE(disp_height, buf_height);

        mFormat->setRect(kKeyCropRect, 0, 0, disp_width - 1, disp_height - 1);

        return INFO_FORMAT_CHANGED;
    }

+1 −0
Original line number Diff line number Diff line
@@ -159,6 +159,7 @@ extern "C"
    Bool    PVDecodeVopBody(VideoDecControls *decCtrl, int32 buffer_size[]);
    void    PVDecPostProcess(VideoDecControls *decCtrl, uint8 *outputYUV);
    OSCL_IMPORT_REF void    PVGetVideoDimensions(VideoDecControls *decCtrl, int32 *display_width, int32 *display_height);
    OSCL_IMPORT_REF void    PVGetBufferDimensions(VideoDecControls *decCtrl, int32 *buf_width, int32 *buf_height);
    OSCL_IMPORT_REF void    PVSetPostProcType(VideoDecControls *decCtrl, int mode);
    uint32  PVGetVideoTimeStamp(VideoDecControls *decoderControl);
    int     PVGetDecBitrate(VideoDecControls *decCtrl);
+6 −0
Original line number Diff line number Diff line
@@ -722,6 +722,12 @@ OSCL_EXPORT_REF void PVGetVideoDimensions(VideoDecControls *decCtrl, int32 *disp
    *display_height = video->displayHeight;
}

OSCL_EXPORT_REF void PVGetBufferDimensions(VideoDecControls *decCtrl, int32 *width, int32 *height) {
    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
    *width = video->width;
    *height = video->height;
}

/* ======================================================================== */
/*  Function : PVGetVideoTimeStamp()                                        */
/*  Date     : 04/27/2000, 08/29/2000                                       */