17f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
27f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
37f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * Redistribution and use in source and binary forms, with or without
47f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * modification, are permitted provided that the following conditions are
57f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * met:
67f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *     * Redistributions of source code must retain the above copyright
77f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *       notice, this list of conditions and the following disclaimer.
87f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *     * Redistributions in binary form must reproduce the above
97f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *       copyright notice, this list of conditions and the following
107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *       disclaimer in the documentation and/or other materials provided
117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *       with the distribution.
127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *     * Neither the name of The Linux Foundation nor the names of its
137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *       contributors may be used to endorse or promote products derived
147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *       from this software without specific prior written permission.
157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He *
287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He */
297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifndef QCAMERA_TEST_H
317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define QCAMERA_TEST_H
327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include <SkData.h>
347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include <SkBitmap.h>
357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include <SkStream.h>
367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Henamespace qcamera {
387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heusing namespace android;
407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define MAX_CAM_INSTANCES 3
427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heclass TestContext;
447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heclass CameraContext : public CameraListener,
467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    public ICameraRecordingProxyListener{
477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hepublic:
487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    typedef enum {
497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        READ_METADATA = 1,
507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        READ_IMAGE = 2,
517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        READ_ALL = 3
527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } ReadMode_t;
537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    // This structure is used to store jpeg file sections in memory.
557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    typedef struct {
567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        unsigned char *  Data;
577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        int      Type;
587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        size_t   Size;
597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } Sections_t;
607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hepublic:
627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    static const char KEY_ZSL[];
637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    CameraContext(int cameraIndex);
657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    virtual ~CameraContext();
667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t openCamera();
707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t closeCamera();
717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t startPreview();
737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t stopPreview();
747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t resumePreview();
757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t autoFocus();
767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t enablePreviewCallbacks();
777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t takePicture();
787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t startRecording();
797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t stopRecording();
807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t startViVRecording();
817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t stopViVRecording();
827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t configureViVRecording();
837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t nextPreviewSize();
857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t setPreviewSize(const char *format);
867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t getCurrentPreviewSize(Size &previewSize);
877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t nextPictureSize();
897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t getCurrentPictureSize(Size &pictureSize);
907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t setPictureSize(const char *format);
917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t nextVideoSize();
937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t setVideoSize(const char *format);
947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t getCurrentVideoSize(Size &videoSize);
957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t configureRecorder();
967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t unconfigureRecorder();
977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Sections_t *FindSection(int SectionType);
987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t ReadSectionsFromBuffer (unsigned char *buffer,
997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            size_t buffer_size, ReadMode_t ReadMode);
1007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    virtual IBinder* onAsBinder();
1017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void setTestCtxInstance(TestContext *instance);
1027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void printMenu(sp<CameraContext> currentCamera);
1047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void printSupportedParams();
1057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    const char *getZSL();
1067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void setZSL(const char *value);
1077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int getCameraIndex() { return mCameraIndex; }
1107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int getNumberOfCameras();
1117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void enablePrintPreview();
1127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void disablePrintPreview();
1137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void enablePiPCapture();
1147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void disablePiPCapture();
1157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void CheckSectionsAllocated();
1167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void DiscardData();
1177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void DiscardSections();
1187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t calcBufferSize(int width, int height);
1197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t calcStride(int width);
1207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t calcYScanLines(int height);
1217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t calcUVScanLines(int height);
1227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2);
1247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    virtual void postData(int32_t msgType,
1257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            const sp<IMemory>& dataPtr,
1267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            camera_frame_metadata_t *metadata);
1277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    virtual void postDataTimestamp(nsecs_t timestamp,
1297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            int32_t msgType,
1307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            const sp<IMemory>& dataPtr);
1317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    virtual void dataCallbackTimestamp(nsecs_t timestamp,
1327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            int32_t msgType,
1337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He            const sp<IMemory>& dataPtr);
1347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heprivate:
1367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t createPreviewSurface(int width, int height, int32_t pixFormat);
1387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t destroyPreviewSurface();
1397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t saveFile(const sp<IMemory>& mem, String8 path);
1417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    SkBitmap * PiPCopyToOneFile(SkBitmap *bitmap0, SkBitmap *bitmap1);
1427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t decodeJPEG(const sp<IMemory>& mem, SkBitmap *skBM);
1437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t encodeJPEG(SkWStream * stream, const SkBitmap *bitmap,
1447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        String8 path);
1457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void previewCallback(const sp<IMemory>& mem);
1467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    static int JpegIdx;
1487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int mCameraIndex;
1497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mResizePreview;
1507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mHardwareActive;
1517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mPreviewRunning;
1527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mRecordRunning;
1537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int  mVideoFd;
1547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int  mVideoIdx;
1557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mRecordingHint;
1567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mDoPrintMenu;
1577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mPiPCapture;
1587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    static int mPiPIdx;
1597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    unsigned int mfmtMultiplier;
1607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int mWidthTmp;
1617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int mHeightTmp;
1627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t mSectionsRead;
1637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t mSectionsAllocated;
1647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Sections_t * mSections;
1657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Sections_t * mJEXIFTmp;
1667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Sections_t mJEXIFSection;
1677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    int mHaveAll;
1687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    TestContext *mInterpr;
1697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    sp<Camera> mCamera;
1717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    sp<SurfaceComposerClient> mClient;
1727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    sp<SurfaceControl> mSurfaceControl;
1737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    sp<Surface> mPreviewSurface;
1747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    sp<MediaRecorder> mRecorder;
1757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    CameraParameters mParams;
1767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    SkBitmap *skBMDec;
1777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    SkBitmap skBMtmp;
1787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    sp<IMemory> PiPPtrTmp;
1797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t mCurrentPreviewSizeIdx;
1817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Size getPreviewSizeFromVideoSizes(Size currentVideoSize);
1827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t mCurrentPictureSizeIdx;
1837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t mCurrentVideoSizeIdx;
1847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Vector<Size> mSupportedPreviewSizes;
1857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Vector<Size> mSupportedPictureSizes;
1867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Vector<Size> mSupportedVideoSizes;
1877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mInUse;
1897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Mutex mLock;
1907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Condition mCond;
1917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void useLock();
1937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void signalFinished();
1947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
1957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    //------------------------------------------------------------------------
1967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    // JPEG markers consist of one or more 0xFF bytes, followed by a marker
1977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    // code byte (which is not an FF).  Here are the marker codes of interest
1987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    // in this program.  (See jdmarker.c for a more complete list.)
1997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    //------------------------------------------------------------------------
2007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF0  0xC0          // Start Of Frame N
2017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF1  0xC1          // N indicates which compression process
2027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF2  0xC2          // Only SOF0-SOF2 are now in common use
2037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF3  0xC3
2047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF5  0xC5          // NB: codes C4 and CC are NOT SOF markers
2057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF6  0xC6
2067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF7  0xC7
2077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF9  0xC9
2087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF10 0xCA
2097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF11 0xCB
2107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF13 0xCD
2117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF14 0xCE
2127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOF15 0xCF
2137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOI   0xD8          // Start Of Image (beginning of datastream)
2147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_EOI   0xD9          // End Of Image (end of datastream)
2157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_SOS   0xDA          // Start Of Scan (begins compressed data)
2167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_JFIF  0xE0          // Jfif marker
2177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_EXIF  0xE1          // Exif marker.  Also used for XMP data!
2187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_XMP   0x10E1        // Not a real tag same value as Exif!
2197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_COM   0xFE          // COMment
2207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_DQT   0xDB
2217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_DHT   0xC4
2227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_DRI   0xDD
2237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define M_IPTC  0xED          // IPTC marker
2247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    #define PSEUDO_IMAGE_MARKER 0x123; // Extra value.
2257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He};
2267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heclass Interpreter
2287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
2297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hepublic:
2307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    enum Commands_e {
2317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        SWITCH_CAMERA_CMD = 'A',
2327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        RESUME_PREVIEW_CMD = '[',
2337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        START_PREVIEW_CMD = '1',
2347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        STOP_PREVIEW_CMD = '2',
2357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        CHANGE_VIDEO_SIZE_CMD = '3',
2367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        CHANGE_PREVIEW_SIZE_CMD = '4',
2377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        CHANGE_PICTURE_SIZE_CMD = '5',
2387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        START_RECORD_CMD = '6',
2397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        STOP_RECORD_CMD = '7',
2407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        START_VIV_RECORD_CMD = '8',
2417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        STOP_VIV_RECORD_CMD = '9',
2427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        DUMP_CAPS_CMD = 'E',
2437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        AUTOFOCUS_CMD = 'f',
2447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        TAKEPICTURE_CMD = 'p',
2457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        TAKEPICTURE_IN_PICTURE_CMD = 'P',
2467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        ENABLE_PRV_CALLBACKS_CMD = '&',
2477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        EXIT_CMD = 'q',
2487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        DELAY = 'd',
2497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        ZSL_CMD = 'z',
2507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        INVALID_CMD = '0'
2517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    };
2527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    struct Command {
2547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        Command( Commands_e cmd_, char *arg_ = NULL)
2557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        : cmd(cmd_)
2567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        , arg(arg_) {}
2577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        Command()
2587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        : cmd(INVALID_CMD)
2597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        , arg(NULL) {}
2607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        Commands_e cmd;
2617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        char *arg;
2627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    };
2637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    /* API */
2657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Interpreter()
2667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    : mUseScript(false)
2677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    , mScript(NULL) {}
2687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Interpreter(const char *file);
2707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    ~Interpreter();
2717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Command getCommand(sp<CameraContext> currentCamera);
2737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void releasePiPBuff();
2747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t configureViVCodec();
2757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void setViVSize(Size VideoSize, int camIndex);
2767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void setTestCtxInst(TestContext *instance);
2777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t unconfigureViVCodec();
2787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t ViVEncoderThread();
2797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void ViVEncode();
2807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    static void *ThreadWrapper(void *context);
2817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heprivate:
2837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    static const int numberOfCommands;
2847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mUseScript;
2867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t mCmdIndex;
2877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    char *mScript;
2887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Vector<Command> mCommands;
2897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    TestContext *mTestContext;
2907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    pthread_t mViVEncThread;
2917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He};
2927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
2937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heclass TestContext
2947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{
2957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    friend class CameraContext;
2967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    friend class Interpreter;
2977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hepublic:
2987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    TestContext();
2997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    ~TestContext();
3007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t GetCamerasNum();
3027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t FunctionalTest();
3037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    status_t AddScriptFromFile(const char *scriptFile);
3047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void setViVSize(Size VideoSize, int camIndex);
3057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void PiPLock();
3067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void PiPUnlock();
3077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void ViVLock();
3087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    void ViVUnlock();
3097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heprivate:
3117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    sp<CameraContext> camera[MAX_CAM_INSTANCES];
3127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    char GetNextCmd(sp<qcamera::CameraContext> currentCamera);
3137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t mCurrentCameraIndex;
3147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    size_t mSaveCurrentCameraIndex;
3157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Vector< sp<qcamera::CameraContext> > mAvailableCameras;
3167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mTestRunning;
3177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Interpreter *mInterpreter;
3187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Mutex mPiPLock;
3197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Condition mPiPCond;
3207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mPiPinUse;
3217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Mutex mViVLock;
3227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    Condition mViVCond;
3237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mViVinUse;
3247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    bool mIsZSLOn;
3257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    typedef struct ViVBuff_t{
3277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        void *buff;
3287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        size_t buffSize;
3297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        size_t YStride;
3307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        size_t UVStride;
3317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        size_t YScanLines;
3327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        size_t UVScanLines;
3337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        size_t srcWidth;
3347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        size_t srcHeight;
3357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } ViVBuff_t;
3367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    typedef struct ViVVid_t{
3387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        sp<IGraphicBufferProducer> bufferProducer;
3397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        sp<Surface> surface;
3407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        sp<MediaCodec> codec;
3417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        sp<MediaMuxer> muxer;
3427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        sp<ANativeWindow> ANW;
3437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        Vector<sp<ABuffer> > buffers;
3447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        Size VideoSizes[2];
3457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        int ViVIdx;
3467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        size_t buff_cnt;
3477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        sp<GraphicBuffer> graphBuf;
3487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        void * mappedBuff;
3497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        bool isBuffValid;
3507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        int sourceCameraID;
3517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He        int destinationCameraID;
3527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    } vidPiP_t;
3537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    ViVVid_t mViVVid;
3557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He    ViVBuff_t mViVBuff;
3567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He};
3577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}; //namespace qcamera
3597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He
3607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif
361