OSDN Git Service

add HEVC(H.265) decoder. plz sync:
[android-x86/external-stagefright-plugins.git] / libstagefright / codecs / ffmpegdec / vdec / SoftFFmpegVideo.h
index 6943b72..cfb3d53 100644 (file)
@@ -26,8 +26,6 @@ extern "C" {
 
 #include <inttypes.h>
 #include <math.h>
-#include <limits.h>
-#include <signal.h>
 #include <limits.h> /* INT_MAX */
 
 #include "config.h"
@@ -40,18 +38,14 @@ extern "C" {
 #include "libavutil/parseutils.h"
 #include "libavutil/samplefmt.h"
 #include "libavutil/avassert.h"
-#include "libavutil/intreadwrite.h"
 #include "libavformat/avformat.h"
 #include "libavdevice/avdevice.h"
 #include "libswscale/swscale.h"
-#include "libavcodec/audioconvert.h"
 #include "libavutil/opt.h"
 #include "libavutil/internal.h"
 #include "libavcodec/avfft.h"
 #include "libswresample/swresample.h"
 
-#include "cmdutils.h"
-
 #ifdef __cplusplus
 }
 #endif
@@ -79,30 +73,52 @@ protected:
 
 private:
     enum {
+        kInputPortIndex   = 0,
+        kOutputPortIndex  = 1,
         kNumInputBuffers  = 5,
         kNumOutputBuffers = 2,
     };
 
     enum {
-        MODE_H264,
-        MODE_MPEG4,
+        MODE_NONE,
         MODE_MPEG2,
         MODE_H263,
+        MODE_MPEG4,
+        MODE_WMV,
+        MODE_RV,
+        MODE_H264,
         MODE_VPX,
         MODE_VC1,
+        MODE_FLV1,
         MODE_DIVX,
-        MODE_WMV12,
-        MODE_FLV,
-        MODE_RV
+        MODE_HEVC,
+        MODE_TRIAL
     } mMode;
 
+    enum EOSStatus {
+        INPUT_DATA_AVAILABLE,
+        INPUT_EOS_SEEN,
+        OUTPUT_FRAMES_FLUSHED
+    };
+
     enum {
-        kPortIndexInput  = 0,
-        kPortIndexOutput = 1,
+        ERR_NO_FRM              = 2,
+        ERR_FLUSHED             = 1,
+               ERR_OK                  = 0,  //No errors
+        ERR_OOM                 = -1, //Out of memmory
+               ERR_CODEC_NOT_FOUND     = -2,
+               ERR_DECODER_OPEN_FAILED = -2,
+               ERR_SWS_FAILED          = -3,
     };
 
+    bool mFFmpegAlreadyInited;
+       bool mCodecAlreadyOpened;
+       bool mPendingFrameAsSettingChanged;
     AVCodecContext *mCtx;
     struct SwsContext *mImgConvertCtx;
+       AVFrame *mFrame;
+
+    EOSStatus mEOSStatus;
 
     bool mExtradataReady;
     bool mIgnoreExtradata;
@@ -116,13 +132,26 @@ private:
         AWAITING_ENABLED
     } mOutputPortSettingsChange;
 
-    void setAVCtxToDefault(AVCodecContext *avctx, const AVCodec *codec);
-    void preProcessVideoFrame(AVPicture *picture, void **bufp);
+    void setMode(const char *name);
+    void initInputFormat(uint32_t mode, OMX_PARAM_PORTDEFINITIONTYPE &def);
+       void getInputFormat(uint32_t mode, OMX_VIDEO_PARAM_PORTFORMATTYPE *formatParams);
+    void setDefaultCtx(AVCodecContext *avctx, const AVCodec *codec);
+    OMX_ERRORTYPE isRoleSupported(const OMX_PARAM_COMPONENTROLETYPE *roleParams);
 
     void initPorts();
     status_t initDecoder();
     void deInitDecoder();
 
+       bool    handlePortSettingChangeEvent();
+       int32_t handleExtradata();
+       int32_t openDecoder();
+    void    initPacket(AVPacket *pkt, OMX_BUFFERHEADERTYPE *inHeader);
+    int32_t decodeVideo();
+    int32_t preProcessVideoFrame(AVPicture *picture, void **bufp);
+       int32_t drainOneOutputBuffer();
+       void    drainEOSOutputBuffer();
+       void    drainAllOutputBuffers();
+
     void updatePortDefinitions();
 
     DISALLOW_EVIL_CONSTRUCTORS(SoftFFmpegVideo);