OSDN Git Service

DO NOT MERGE: Support non-multiple-of-16 dimensions in MPEG4/H.263 software decoder
authorAndreas Huber <andih@google.com>
Mon, 24 Jan 2011 21:36:30 +0000 (13:36 -0800)
committerAndreas Huber <andih@google.com>
Mon, 24 Jan 2011 23:59:14 +0000 (15:59 -0800)
Change-Id: I6c27c00a6e13cb3635e61089c0db0989f5810c37
related-to-bug: 3384367

media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp
media/libstagefright/codecs/m4v_h263/dec/include/mp4dec_api.h
media/libstagefright/codecs/m4v_h263/dec/src/pvdec_api.cpp

index 0f08f6e..dcf129e 100644 (file)
@@ -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;
@@ -132,7 +132,7 @@ status_t M4vH263Decoder::start(MetaData *) {
     }
 
     MP4DecodingMode actualMode = PVGetDecBitstreamMode(mHandle);
-    CHECK_EQ(mode, actualMode);
+    CHECK_EQ((int)mode, (int)actualMode);
 
     PVSetPostProcType((VideoDecControls *) mHandle, 0);
 
@@ -182,7 +182,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;
@@ -220,19 +220,26 @@ 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);
+
         return INFO_FORMAT_CHANGED;
     }
 
index ef09900..24a50ce 100644 (file)
@@ -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);
index 0c354d9..844bd14 100644 (file)
@@ -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                                       */