khronosfws/openmax_al/src/adaptation/xaadaptation.h
changeset 12 5a06f39ad45b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/khronosfws/openmax_al/src/adaptation/xaadaptation.h	Fri Apr 16 15:29:42 2010 +0300
@@ -0,0 +1,490 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#ifndef XAADAPTATION_H_
+#define XAADAPTATION_H_
+
+#include <pthread.h>
+#include <semaphore.h>
+#include <string.h>
+#include <unistd.h>
+#include "openmaxalwrapper.h"
+#include "XAAdaptationContextBase.h"
+#include "XAGlobals.h"
+#include <gst.h>
+#include <gstappsrc.h>
+#include <gstappsink.h>
+#include <gstappbuffer.h>
+#include <photography.h>
+#include <OpenMAXAL_ContentPipe.h>
+#include "XAPlatform.h"
+#include "XAStaticCapsAdaptation.h"
+
+#ifdef XA_IMPL_MEASURE_GST_DELAY
+#include <time.h>
+#endif /* XA_IMPL_MEASURE_GST_DELAY */
+
+/* MACROS */
+#define FLIP_NONE               0
+#define FLIP_CLOCKWISE          1 /* Rotate clockwise 90 degrees */
+#define FLIP_ROTATE_180         2 /* Rotate 180 degrees */
+#define FLIP_COUNTERCLOCKWISE   3 /* Rotate counter-clockwise 90 degrees */
+#define FLIP_HORIZONTAL         4 /* Flip image horizontally */
+#define FLIP_VERTICAL           5 /* Flip image vertically */
+
+/* TYPEDEFS */
+typedef gboolean (*GstBusCb)( GstBus *bus, GstMessage *message, gpointer data );
+#define XA_IMPL_SUPPORTED_AUDIO_OUT_NUM 3
+#define XA_IMPL_OMIX_MAX_CONNECTED_MEDIAPLAYERS 10
+#define CONTENT_PIPE_BUFFER_SIZE 1000
+#define TEST_VIDEO_WIDTH     640
+#define TEST_VIDEO_HEIGHT    480
+
+typedef enum
+{
+    XA_AUDIO_WAVENC = 0,
+    XA_AUDIO_VORBISENC,
+    XA_AUDIO_PCM,
+    XA_NUM_OF_AUDIOENCODERS /* Do not move this line */
+} XAAudioEnc;
+
+typedef enum
+{
+    XA_VIDEO_JPEGENC = 0,
+    XA_VIDEO_THEORAENC,
+    XA_NUM_OF_VIDEOENCODERS /* Do not move this line */
+} XAVideoEnc;
+
+typedef enum CP_STATE
+{
+	CPStateNull =0,
+	CPStateInitialized,
+	CPStatePrerolling,
+	CPStateStarted,
+	CPStateRunning,
+	CPStatePaused,
+	CPStateStopped,
+	CPStateWaitForData,
+	CPStateEOS,
+	CPStateError
+}CP_STATE;
+
+typedef enum
+{
+    XA_IMAGE_JPEGENC = 0,
+    XA_IMAGE_RAW,
+    XA_NUM_OF_IMAGEENCODERS /* Do not move this line */
+} XAImageEnc;
+
+typedef enum
+{
+    XA_RADIO_IDLE,
+    XA_RADIO_SEEKING,
+    XA_RADIO_SETTING_FREQUENCY,
+    XA_RADIO_SETTING_FREQUENCY_RANGE
+} XARadioState;
+
+typedef enum
+{
+    XA_RADIO_RDS_IDLE,
+    XA_RADIO_RDS_GETTING_ODA_GROUP
+} XARadioRDSState;
+/* STRUCTURES */
+
+typedef struct XAAdaptEvtHdlr_
+{
+    xaAdaptEventHandler handlerfunc;    /* function handling the callback */
+    void               *handlercontext; /* context of handler */
+    XAuint32            eventtypes;     /* what kind of events this handles */
+} XAAdaptEvtHdlr;
+
+/* Structure for content pipe thread context */
+typedef struct XAAdaptCpThrCtx_
+{
+	XADataLocator_ContentPipe* pipe; 	/* pointer to content Pipe structure (Sink/Source) */
+	CPhandle	dataHandle; 			/* Handle to content pipe data */
+	CP_STATE	state;
+	XAConfigExtensionCpKey cpConfig; 	/* enum value for CP using e.g. ReadBuffer or WriteBuffer */
+	XAImplSemHandle stateSem;
+	XAImplSemHandle mpStateSem;
+	XAImplSemHandle mpPrerollStateSem;
+
+	GstAppSrc	*appSrc; 				/* Pointer to appSrc where data is read from. Not owned */
+	GstAppSink  *appSink; 				/* Pointer to AppSink where dats is fed. Not owned */
+}XAAdaptCpThrCtx;
+
+/* context to track buffer insufficient event */
+typedef struct recordItfCtx_{
+    XAImplSemHandle bufInsufficientSem;
+    XAboolean buffer_insufficient;
+}recodtItfCtx;
+
+/*
+ * Structure that holds all common variables for every
+ * Gst-Adaptation context structures.
+ */
+typedef struct XAAdaptationBaseCtx_
+{
+    /* Common Variables for all adaptation elements */
+    XAuint32        ctxId;
+    GstState        binWantedState;   /** requested gst-bin target state **/
+    GstElement      *bin;       /** Container for all gst elements **/
+
+    GstBus          *bus;       /** Gst-bus where gst sends messages **/
+    GMainLoop       *busloop;       /** Gst-bus listener loop **/
+    pthread_t       busloopThr;
+    GstBusCb        busCb;      /** Gst-Bus callback funtion*/
+
+    GArray*         evtHdlrs;    /* array of event handlers */
+
+    XAboolean       waitingasyncop;
+    sem_t           semAsyncWait;
+    guint           asynctimer;
+
+    XAConfigExtensionCpKey cpConfig; /* enum value for CP using e.g. ReadBuffer or WriteBuffer */
+
+	/* Content Pipe variables */
+	XAImplThreadHandle	pipeSrcThr, pipeSinkThr;
+	XAAdaptCpThrCtx		pipeSrcThrCtx, pipeSinkThrCtx;
+
+#ifdef XA_IMPL_MEASURE_GST_DELAY
+    clock_t     startTime;
+    clock_t     endTime;
+    double      diff;
+#endif /*XA_IMPL_MEASURE_GST_DELAY*/
+    // VASU MOD BEGINS
+    XAboolean thread_launched;
+    pthread_mutex_t ds_mutex;
+    pthread_cond_t ds_condition;
+    XAboolean cond_mutx_inited;
+    // VASU MOD ENDS
+    /* FUNCTIONS*/
+
+} XAAdaptationBaseCtx_;
+
+typedef struct XAEngineAdaptationCtx_
+{
+    /* Parent*/
+    XAAdaptationBaseCtx_    baseObj;
+
+} XAEngineAdaptationCtx_;
+
+typedef struct XAMetadataAdaptVars_
+{
+
+    XAuint32        childcount;
+    XAuint32        nodedepth;
+    XAuint32        traversemode;
+
+    GstTagList*     generaltags;
+    GstStructure*   audiotags;
+    GstStructure*   videotags;
+    GstStructure**   currentchild; /*points to one of previous 3*/
+
+} XAMetadataAdaptVars;
+
+
+/*
+ * Structure for Media Player specific gst-adaptation.
+ */
+typedef struct XAMediaPlayerAdaptationCtx_
+{
+    /* Parent*/
+    XAAdaptationBaseCtx_    baseObj;
+
+    /* OMX-AL Variables */
+    XADataSource            *xaSource, *xaBankSrc;
+    XADataSink              *xaAudioSink, *xaVideoSink, *xaLEDArray, *xaVibra;
+
+    /* GST elements */
+    GstElement              *source;
+    XAboolean               isobjsrc;    /*is source another XA object?*/
+    GstElement              *codecbin;
+    GstElement              *audioppbin;
+    GstElement              *videoppbin;
+    GstElement				*filter;
+    GstElement              *videoppBScrbin;
+    GstElement              *inputSelector;
+    GstPad                  *blackScrSrcPad;
+    GstPad                  *videoScrSrcPad;
+    GstPad                  *blackScrSinkPad;
+    GstPad                  *videoScrSinkPad;
+    GstElement              *audiosink;
+    XAboolean               isobjasink;   /*is audio sink another XA object?*/
+    GstElement              *videosink;
+    XAboolean               isobjvsink;   /*is video sink another XA object?*/
+
+    XAboolean               mute;
+    XAuint32                imageEffectID;
+    XAboolean               isStereoPosition;
+    XAmillidegree           curRotation;
+    XAuint32                curMirror;
+
+    XAint32                 buffering;
+
+    /* internals */
+    XAboolean               trackpositionenabled;
+    guint                   runpositiontimer;
+    GSourceFunc             positionCb;
+    gint64                  lastpos;
+
+    XAboolean               loopingenabled;
+    gint64                  loopstart;
+    gint64                  loopend;
+
+    gdouble                 playrate;
+    guint32                 rateprops;
+
+    XAboolean				cameraSinkSynced;
+
+    XAMetadataAdaptVars     *metadatavars;
+
+} XAMediaPlayerAdaptationCtx_;
+
+typedef struct XASnapshotItfVars_
+{
+
+    /*User variables*/
+    XAuint32        numpics;
+    XAuint32        fps;
+    XAboolean       freeze;
+    gchar*          fnametemplate;
+    XADataSink*     xaSink;
+
+    /* internal variables */
+    gboolean        waitforbuffer;
+    gboolean        parsenegotiated;
+    XAuint32        numpicstaken;
+
+    GstBus*         ssbus;
+    GstElement*     sspipeline;
+    GstElement*     ssbuffersrc;
+    GstElement*     ssparser;
+    GstElement*     ssscaler;
+    GstElement*     ssfilter;
+    GstElement*     ssencoder;
+    GstElement*     sstagger;
+    GstElement*     sssink;
+    gulong          sighandler;
+
+    GstBuffer*      snapshotbuffer;
+
+} XASnapshotItfVars;
+
+typedef struct XAMediaRecorderAdaptationCtx_
+{
+    /* Parent*/
+    XAAdaptationBaseCtx_ baseObj;
+
+    /* OMX-AL Variables */
+    XADataSource            *xaAudioSource, *xaVideoSource;
+    XADataSink              *xaSink;
+    XAuint8                 recModes;
+
+    /* GST elements */
+    GstElement              *datasink;
+    XAboolean               isobjsink;   /*is sink another XA object?*/
+    GstElement              *codecbin;
+    GstElement              *audioppbin;
+    GstElement              *audiofilter;
+    GstElement              *videoppbin;
+    GstElement              *videofilter;
+    GstElement              *videoextract;
+    GstElement              *audiosource;
+    GstElement              *audioqueue;
+    XAboolean               isobjasrc;    /*is audio source another XA object?*/
+    GstElement              *videosource;
+    GstState				vsrcOrigState;
+    GstElement              *videoqueue;
+    XAboolean               isobjvsrc;    /*is video source another XA object?*/
+    XAboolean               encodingchanged;
+
+    XAboolean               mute;
+    XAuint32                imageEffectID;
+    XAboolean               isStereoPosition;
+    XAuint32                xaRecordState;
+    XAmillidegree           curRotation;
+    XAuint32                curMirror;
+    XAboolean               isRecord;
+
+    /* internals */
+    XAboolean               trackpositionenabled;
+    gboolean                runpositiontimer;
+    GSourceFunc             positionCb;
+
+    XAImplThreadHandle      recordingEventThr;
+    recodtItfCtx            recThrCtx;
+
+
+    /* Variables for snapshot */
+    XASnapshotItfVars       snapshotVars;
+
+    XAMetadataAdaptVars     *metadatavars;
+
+    /* Variables for encoders */
+    XAAudioEncoderSettings  audioEncSettings;
+    XAVideoSettings         videoEncSettings;
+    XAImageSettings         imageEncSettings;
+
+    /*buffersink variable*/
+    guint64                 writepos;
+
+} XAMediaRecorderAdaptationCtx_;
+
+
+/*
+ * Structure for Camera specific gst-adaptation variables
+ */
+typedef struct XACameraAdaptationCtx_ {
+
+    /* Parent*/
+    XAAdaptationBaseCtx_ baseObj;
+
+    /* OMX-AL Variables */
+    XAuint32        deviceID;
+    XAuint32        imageEffectID;
+    XAmillidegree   curRotation;
+    XAuint32        curMirror;
+
+    /* GST Variables */
+    GstFocusStatus focusStatus;
+
+    /* Internals */
+    XAboolean		recording;
+    XAboolean		playing;
+    XAboolean		snapshotting;
+} XACameraAdaptationCtx_;
+
+/*
+ * Structure for Camera specific gst-adaptation variables
+ */
+typedef struct XARadioAdaptationCtx_ {
+
+    /* Parent*/
+    XAAdaptationBaseCtx_ baseObj;
+
+    /* OMX-AL Variables */
+    XAuint32 frequency;
+    XAuint8 range;
+
+    pthread_t emulationThread;
+    pthread_t rdsEmulationThread;
+    XARadioRDSState rdsState;
+    XARadioState state;
+
+    /* GST Variables */
+} XARadioAdaptationCtx_;
+
+
+typedef struct XAOMixAdaptConnObj_
+{
+    /*pointer to connected context*/
+    XAAdaptationBaseCtx* ctx;
+    /*pointer to sink currently used by connected ctx*/
+    GstElement* currentSink;
+} XAOMixAdaptConnObj;
+
+typedef struct XAOutputMixAdaptationCtx_
+{
+    /* Parent*/
+    XAAdaptationBaseCtx_ baseObj;
+    /* Internal variables */
+    XAboolean   isStereoPosition;
+    XAboolean	mute;
+
+    XAuint32    currentrouting;
+
+    GArray* 	availableDevices;
+    GArray*     connectedObjects;
+} XAOutputMixAdaptationCtx_;
+
+/*
+ * Structure for Ledarray specific gst-adaptation variables
+ */
+typedef struct XALEDArrayAdaptationCtx_ {
+
+    /* Parent*/
+    XAAdaptationBaseCtx_ baseObj;
+
+    /* OMX-AL Variables */
+    XAuint32    deviceID;
+
+    /* GST Variables */
+
+} XALedarrayAdaptationCtx_;
+
+/*
+ * Structure for Vibra specific gst-adaptation variables
+ */
+typedef struct XAVibraAdaptationCtx_ {
+
+    /* Parent*/
+    XAAdaptationBaseCtx_ baseObj;
+
+    /* OMX-AL Variables */
+    XAuint32    deviceID;
+
+    /* GST Variables */
+} XAVibraAdaptationCtx_;
+
+/* FUNCTIONS */
+/*
+ * gboolean XAAdaptationBase_GstBusCb( GstBus *bus, GstMessage *message, gpointer data );
+ * Default CallBack handler for gst-bus messages. This will be called if object specific callback is
+ * not implemented.
+ */
+gboolean XAAdaptationBase_GstBusCb( GstBus *bus, GstMessage *message, gpointer data );
+
+XAresult XAAdaptationBase_InitGstListener(XAAdaptationBaseCtx* ctx);
+void * XAAdaptationBase_LaunchGstListener(void* args);
+void XAAdaptationBase_StopGstListener(XAAdaptationBaseCtx* ctx);
+void XAAdaptationBase_SendAdaptEvents(XAAdaptationBaseCtx* ctx, XAAdaptEvent* event);
+
+void XAAdaptationBase_PrepareAsyncWait(XAAdaptationBaseCtx* ctx);
+void XAAdaptationBase_StartAsyncWait(XAAdaptationBaseCtx* ctx);
+gboolean XAAdaptationBase_CancelAsyncWait(gpointer ctx);
+void XAAdaptationBase_CompleteAsyncWait(XAAdaptationBaseCtx* ctx);
+
+GstElement* XAAdaptationBase_CreateGstSource( XADataSource* xaSrc, const char *name, XAboolean *isobj, XAboolean *isPCM, XAboolean *isRawImage );
+GstElement* XAAdaptationBase_CreateGstSink( XADataSink* xaSrc, const char *name, XAboolean *isobj );
+GstElement* XAAdaptationBase_CreateVideoPP( );
+
+GstElement* XAAdaptationBase_CreateVideoPPBlackScr( );
+GstElement* XAAdaptationBase_CreateInputSelector( );
+GstElement* XAAdaptationBase_CreateAudioPP( );
+void XAAdaptationBase_PadBlockCb(GstPad *pad, gboolean blocked, gpointer user_data);
+void XAAdaptationBase_SetAllCaps (GstCaps * caps, char *field, ...);
+
+XAresult XAMediaPlayerAdapt_UpdatePositionCbTimer(XAMediaPlayerAdaptationCtx_* mCtx);
+
+XAresult XAMediaRecorderAdapt_ChangeEncoders( XAMediaRecorderAdaptationCtx_* mCtx );
+XAresult XAMediaRecorderAdapt_CheckCodec( XAMediaRecorderAdaptationCtx_* mCtx, XACapsType encType, XAuint32 encoderId );
+
+XAresult XAMetadataAdapt_TryWriteTags(XAAdaptationBaseCtx* mCtx, GstBin* binToWriteTo);
+void XAMetadataAdapt_FreeVars(XAMetadataAdaptVars *vars);
+
+GstElement* XAOutputMixAdapt_GetSink(XAAdaptationBaseCtx* bCtx);
+
+
+XAresult XAOutputMixAdapt_ConnectObject(XAAdaptationBaseCtx* omCtx, XAAdaptationBaseCtx* bCtx, GstElement* usedMix);
+XAresult XAOutputMixAdapt_DisconnectObject(XAAdaptationBaseCtx* omCtx, XAAdaptationBaseCtx* bCtx);
+void* XAAdaptationBase_ContentPipeScrThrFunc( void* arg);
+void* XAAdaptationBase_ContentPipeSinkThrFunc( void* arg);
+CPresult XAAdaptationBase_ContentPipeSrcCb(CP_EVENTTYPE eEvent, CPuint iParam);
+CPresult XAAdaptationBase_ContentPipeSinkCb(CP_EVENTTYPE eEvent, CPuint iParam);
+
+#endif /* XAADAPTATION_H_ */