--- a/khronosfws/openmax_al/src/gst_adaptation/xamediarecorderadaptctx.c Fri Sep 17 08:33:15 2010 +0300
+++ b/khronosfws/openmax_al/src/gst_adaptation/xamediarecorderadaptctx.c Mon Oct 04 00:51:56 2010 +0300
@@ -16,22 +16,16 @@
*/
#include <string.h>
-#include <assert.h>
#include <gst/gst.h>
-#include <gst/app/gstappsink.h>
#include "xacapabilitiesmgr.h"
#include "xamediarecorderadaptctx.h"
-
+#include "xaobjectitf.h"
/*forward declarations*/
GstElement* XAMediaRecorderAdapt_CreateEncodeBin(
XAMediaRecorderAdaptationCtx* ctx);
XAresult XAMediaRecorderAdapt_CreatePipeline(
XAMediaRecorderAdaptationCtx* ctx);
-void XAMediaRecorderAdapt_BufferAvailable(GstElement* sink,
- gpointer user_data);
-/** Creates the caps gst element */
-/*static XAresult XAMediaRecorderAdapt_CreateCapsFilter( XAMediaRecorderAdaptationCtx* ctx );*/
/*
* gboolean XAMediaRecorderAdapt_GstBusCb( GstBus *bus, GstMessage *message, gpointer data )
@@ -39,112 +33,120 @@
*/
gboolean XAMediaRecorderAdapt_GstBusCb(GstBus *bus, GstMessage *message,
gpointer data)
-{
+ {
XAAdaptationGstCtx* bCtx = (XAAdaptationGstCtx*) data;
+ XAMediaRecorderAdaptationCtx* mCtx = (XAMediaRecorderAdaptationCtx*)data;
+
/* only listen to pipeline messages */
- if (GST_MESSAGE_SRC(message)==GST_OBJECT(bCtx->bin))
- {
- XAMediaRecorderAdaptationCtx* mCtx = NULL;
- DEBUG_API_A2("->XAMediaRecorderAdapt_GstBusCb:\"%s\" from object \"%s\"",
- GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message)));
- mCtx = (XAMediaRecorderAdaptationCtx*)data;
+ DEBUG_API_A2_STR("->XAMediaRecorderAdapt_GstBusCb:\"%s\" from object \"%s\"",
+ GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message)));
- switch( GST_MESSAGE_TYPE(message))
+ switch( GST_MESSAGE_TYPE(message))
{
- case GST_MESSAGE_EOS:
+ case GST_MESSAGE_EOS:
{
+ if (GST_MESSAGE_SRC(message)==GST_OBJECT(bCtx->bin))
+ {
/* stop position tracking */
if(mCtx->runpositiontimer > 0)
- {
+ {
g_source_remove(mCtx->runpositiontimer);
- mCtx->runpositiontimer = 0;
- }
+ mCtx->runpositiontimer=0;
+ }
/* complete any ongoing client async operations */
XAAdaptationGst_CompleteAsyncWait(bCtx);
- /* send needed events */
- {
- XAAdaptEvent event = {XA_RECORDITFEVENTS, XA_RECORDEVENT_HEADATLIMIT, 0, NULL };
- XAAdaptationBase_SendAdaptEvents(&bCtx->baseObj, &event );
- }
if(mCtx->positionCb)
- {
+ {
mCtx->positionCb(bCtx);
- }
+ }
bCtx->binWantedState = GST_STATE_PAUSED;
- break;
- }
- case GST_MESSAGE_STATE_CHANGED:
- {
- GstState oldstate, newstate, pendingstate, gsttargetstate;
- gst_message_parse_state_changed(message, &oldstate, &newstate, &pendingstate);
- gsttargetstate = GST_STATE_TARGET(bCtx->bin);
- DEBUG_INFO_A4("old %d -> new %d (-> pending %d -> gsttarget %d)",
- oldstate, newstate, pendingstate, gsttargetstate);
- if(gsttargetstate!=bCtx->binWantedState)
- {
- DEBUG_ERR_A1("WARNING: Gst target is not wanted target [%d]!!!", bCtx->binWantedState);
- }
- /* print out some more info */
- if( pendingstate == GST_STATE_VOID_PENDING )
- {
- if( newstate != bCtx->binWantedState )
+
+ if(bCtx->busError)
{
- DEBUG_INFO_A2("Gst in intermediate state transition (curr %d, target %d)",
- newstate,bCtx->binWantedState);
- }
- else
- {
- DEBUG_INFO_A1("Gst in wanted target state (%d)",newstate);
+ XAObjItfCBData objdata = {XA_OBJECT_EVENT_RESOURCES_LOST, XA_RESULT_RESOURCE_ERROR, XA_OBJECT_STATE_UNREALIZED, NULL};
+ XAAdaptEvent event = {XA_OBJECTITFEVENTS, 0, sizeof(objdata), NULL };
+ event.data = &objdata;
+ /* send needed events */
+
+ XAAdaptationBase_SendAdaptEvents(&bCtx->baseObj, &event );
}
}
- if( oldstate!=GST_STATE_PLAYING && newstate==GST_STATE_PLAYING )
+ break;
+ }
+ case GST_MESSAGE_STATE_CHANGED:
+ {
+ if (GST_MESSAGE_SRC(message)==GST_OBJECT(bCtx->bin))
{
- XAAdaptEvent event = {XA_RECORDITFEVENTS, XA_RECORDEVENT_HEADMOVING, 0, NULL };
- /* send needed events */
- XAAdaptationBase_SendAdaptEvents(&bCtx->baseObj, &event );
- /* enable position tracking if needed */
- if( mCtx->runpositiontimer==0 && mCtx->trackpositionenabled && mCtx->positionCb )
+ GstState oldstate, newstate, pendingstate, gsttargetstate;
+ gst_message_parse_state_changed(message, &oldstate, &newstate, &pendingstate);
+ gsttargetstate = GST_STATE_TARGET(bCtx->bin);
+ DEBUG_INFO_A4("old %d -> new %d (-> pending %d -> gsttarget %d)",
+ oldstate, newstate, pendingstate, gsttargetstate);
+ if(gsttargetstate!=bCtx->binWantedState)
+ {
+ DEBUG_ERR_A1("WARNING: Gst target is not wanted target [%d]!!!", bCtx->binWantedState);
+ }
+ /* print out some more info */
+ if( pendingstate == GST_STATE_VOID_PENDING )
{
- mCtx->runpositiontimer = g_timeout_add(XA_ADAPT_PU_INTERVAL, mCtx->positionCb, mCtx);
+ if( newstate != bCtx->binWantedState )
+ {
+ DEBUG_INFO_A2("Gst in intermediate state transition (curr %d, target %d)",
+ newstate,bCtx->binWantedState);
+ }
+ else
+ {
+ DEBUG_INFO_A1("Gst in wanted target state (%d)",newstate);
+ }
+ }
+ if( oldstate!=GST_STATE_PLAYING && newstate==GST_STATE_PLAYING )
+ {
+ XAAdaptEvent event = {XA_RECORDITFEVENTS, XA_RECORDEVENT_HEADMOVING, 0, NULL };
+ /* send needed events */
+ XAAdaptationBase_SendAdaptEvents(&bCtx->baseObj, &event );
+ /* enable position tracking if needed */
+ if( mCtx->runpositiontimer==0 && mCtx->trackpositionenabled && mCtx->positionCb )
+ {
+ mCtx->runpositiontimer = g_timeout_add(XA_ADAPT_PU_INTERVAL, mCtx->positionCb, mCtx);
+ }
}
}
break;
}
- case GST_MESSAGE_ASYNC_DONE:
+ case GST_MESSAGE_ASYNC_DONE:
{
/* some async sequence ended */
XAAdaptationGst_CompleteAsyncWait(bCtx);
break;
}
- case GST_MESSAGE_ERROR:
+ case GST_MESSAGE_ERROR:
{
- GError* error;
gchar* debug;
- gst_message_parse_error(message, &error, &debug);
- DEBUG_ERR_A1("Gst reports error \"%s\"", debug);
+ gst_message_parse_error(message, &(bCtx->busError), &debug);
+ DEBUG_ERR_A1_STR("Gst reports error \"%s\"", debug);
+
/* stop waiting any ongoing async operations */
XAAdaptationGst_CompleteAsyncWait(bCtx);
break;
}
- case GST_MESSAGE_WARNING:
+ case GST_MESSAGE_WARNING:
{
GError* error;
gchar* debug;
gst_message_parse_warning(message, &error, &debug);
- DEBUG_ERR_A1("Gst reports warning \"%s\"", debug);
+ DEBUG_ERR_A1_STR("Gst reports warning \"%s\"", debug);
/* stop waiting any ongoing async operations */
XAAdaptationGst_CompleteAsyncWait(bCtx);
break;
}
- default:
- break;
+ default:
+ break;
}
DEBUG_API("<-XAMediaRecorderAdapt_GstBusCb");
- }
return TRUE;
}
@@ -158,46 +160,34 @@
*/
XAAdaptationBaseCtx* XAMediaRecorderAdapt_Create(XADataSource* pAudioSrc,
XADataSource* pImageVideoSrc, XADataSink* pDataSnk, XAuint8 recModes)
-{
+ {
XAMediaRecorderAdaptationCtx *pSelf = NULL;
DEBUG_API("->XAMediaRecorderAdapt_Create");
pSelf = (XAMediaRecorderAdaptationCtx*)calloc(1, sizeof(XAMediaRecorderAdaptationCtx));
if (pSelf)
- {
+ {
if (XAAdaptationGst_Init(&(pSelf->baseObj),
XAMediaRecorderAdaptation) != XA_RESULT_SUCCESS)
- {
+ {
DEBUG_ERR("Failed to init base context!!!");
free(pSelf);
pSelf = NULL;
DEBUG_API("<-XAMediaRecorderAdapt_Create");
return NULL;
- }
+ }
else
- {
+ {
pSelf->baseObj.baseObj.fwtype = FWMgrFWGST;
pSelf->xaAudioSource = pAudioSrc;
pSelf->xaVideoSource = pImageVideoSrc;
pSelf->xaSink = pDataSnk;
-/* pSelf->baseObj.pipeSinkThrCtx.state = CPStateNull;*/
pSelf->xaRecordState = XA_RECORDSTATE_STOPPED;
- pSelf->curMirror = XA_VIDEOMIRROR_NONE;
- pSelf->curRotation = 0;
pSelf->recModes = recModes;
pSelf->isRecord = XA_BOOLEAN_FALSE;
/* defaults from API spec */
- pSelf->imageEncSettings.width = 640;
- pSelf->imageEncSettings.height = 480;
- pSelf->imageEncSettings.compressionLevel = 0;
- pSelf->imageEncSettings.encoderId = XA_IMAGECODEC_JPEG;
- pSelf->imageEncSettings.colorFormat = XA_COLORFORMAT_UNUSED;
/* no specified defaults for rest, determined later from container type */
- pSelf->videoEncSettings.encoderId = XA_ADAPTID_UNINITED;
- pSelf->videoEncSettings.width = 640;
- pSelf->videoEncSettings.height = 480;
- pSelf->videoEncSettings.frameRate = 15;
pSelf->audioEncSettings.encoderId = XA_ADAPTID_UNINITED;
pSelf->audioEncSettings.channelsIn = 0;
pSelf->audioEncSettings.channelsOut = 0;
@@ -211,12 +201,12 @@
pSelf->audioEncSettings.streamFormat = 0;
pSelf->audioEncSettings.encodeOptions = 0;
pSelf->audioEncSettings.blockAlignment = 0;
+ }
}
- }
DEBUG_API("<-XAMediaRecorderAdapt_Create");
return (XAAdaptationBaseCtx*) &pSelf->baseObj;
-}
+ }
/*
* XAresult XAMediaRecorderAdapt_PostInit()
@@ -225,26 +215,26 @@
* @return XAresult - Success value
*/
XAresult XAMediaRecorderAdapt_PostInit(XAAdaptationGstCtx* bCtx)
-{
+ {
GstStateChangeReturn gret;
XAresult ret = XA_RESULT_SUCCESS;
XAMediaRecorderAdaptationCtx* ctx = NULL;
DEBUG_API("->XAMediaRecorderAdapt_PostInit");
if (bCtx == NULL || bCtx->baseObj.ctxId != XAMediaRecorderAdaptation)
- {
+ {
DEBUG_ERR("Invalid parameter!!");
DEBUG_API("<-XAMediaRecorderAdapt_PostInit");
return XA_RESULT_PARAMETER_INVALID;
- }
+ }
ctx = (XAMediaRecorderAdaptationCtx*) bCtx;
ret = XAAdaptationGst_PostInit(bCtx);
if (ret != XA_RESULT_SUCCESS)
- {
+ {
DEBUG_ERR("Gst context postinit failed!!");
return ret;
- }
+ }
/* top level bin for media recorder */
bCtx->bin = gst_pipeline_new("media_recorder");
@@ -252,13 +242,13 @@
/* Create Gst bus listener. */
ret = XAAdaptationGst_InitGstListener(bCtx);
if (ret != XA_RESULT_SUCCESS)
- {
+ {
DEBUG_ERR("Bus listener creation failed!!");
return ret;
- }
+ }
/* Add Media Recorder specific handler */
if (bCtx->bus)
- {
+ {
bCtx->busCb = XAMediaRecorderAdapt_GstBusCb;
gst_bus_add_signal_watch(bCtx->bus);
g_signal_connect(bCtx->bus, "message::eos", G_CALLBACK(bCtx->busCb), ctx );
@@ -267,53 +257,52 @@
g_signal_connect(bCtx->bus, "message::state-changed", G_CALLBACK(bCtx->busCb), ctx );
g_signal_connect(bCtx->bus, "message::segment-done", G_CALLBACK(bCtx->busCb), ctx );
g_signal_connect(bCtx->bus, "message::async-done", G_CALLBACK(bCtx->busCb), ctx );
- }
+ }
else
- {
+ {
DEBUG_ERR("Failed to create message bus");
return XA_RESULT_INTERNAL_ERROR;
- }
-
- XAMetadataAdapt_PreInit(bCtx);
+ }
/* create pipeline */
ret = XAMediaRecorderAdapt_CreatePipeline(ctx);
if (ret != XA_RESULT_SUCCESS)
- {
+ {
DEBUG_ERR("Failed to create recorder pipeline");
return XA_RESULT_INTERNAL_ERROR;
- }
+ }
#ifdef XA_IMPL_MEASURE_GST_DELAY
bCtx->startTime = clock();
#endif /* XA_IMPL_MEASURE_GST_DELAY */
+
/* roll up bin */
- bCtx->binWantedState = GST_STATE_PAUSED;
+ bCtx->binWantedState = GST_STATE_READY;
XAAdaptationGst_PrepareAsyncWait(bCtx);
gret = gst_element_set_state(GST_ELEMENT(bCtx->bin), bCtx->binWantedState);
if (gret == GST_STATE_CHANGE_ASYNC)
- {
+ {
DEBUG_INFO("Wait for preroll");
XAAdaptationGst_StartAsyncWait(bCtx);DEBUG_INFO("Preroll ready");
- }
+ }
else if (gret == GST_STATE_CHANGE_FAILURE)
- {
+ {
DEBUG_ERR("Preroll FAILED");
/*ret = XA_RESULT_INTERNAL_ERROR;*/
- }
+ }
#ifdef XA_IMPL_MEASURE_GST_DELAY
bCtx->endTime = clock();
double diff = bCtx->endTime - bCtx->startTime;
diff = diff / CLOCKS_PER_SEC;
DEBUG_API_A1( "Starting up bin took %.4lf secs",diff);
#endif /* XA_IMPL_MEASURE_GST_DELAY */
- XAMetadataAdapt_PostInit(bCtx);
+
bCtx->waitingasyncop = XA_BOOLEAN_FALSE;
DEBUG_API("<-XAMediaRecorderAdapt_PostInit");
return ret;
-}
+ }
/*
* void XAMediaRecorderAdapt_Destroy( XAAdaptationGstCtx* bCtx )
@@ -321,407 +310,168 @@
* @param ctx - Media Recorder Adaptation context to be destroyed
*/
void XAMediaRecorderAdapt_Destroy(XAAdaptationGstCtx* bCtx)
-{
+ {
XAMediaRecorderAdaptationCtx* ctx = NULL;
char* fname = NULL;
DEBUG_API("->XAMediaRecorderAdapt_Destroy");
if (bCtx == NULL || bCtx->baseObj.ctxId != XAMediaRecorderAdaptation)
- {
+ {
DEBUG_ERR("Invalid parameter!!");
DEBUG_API("<-XAMediaRecorderAdapt_Destroy");
return;
- }
+ }
ctx = (XAMediaRecorderAdaptationCtx*) bCtx;
if (ctx->isRecord == XA_BOOLEAN_FALSE)
- {
+ {
DEBUG_INFO("Removing unnecessary file.");
- if (ctx->xaSink && *((XAuint32*) (ctx->xaSink->pLocator)) == XA_DATALOCATOR_URI)
- {
- if (strncmp( (char *)((XADataLocator_URI*)(ctx->xaSink->pLocator))->URI, "file:///", 8) == 0)
+
+ if (ctx->xaSink && *((XAuint32*) (ctx->xaSink->pLocator))
+ == XA_DATALOCATOR_URI)
{
- fname = (char *) &(((XADataLocator_URI*) (ctx->xaSink->pLocator))->URI[8]);
- }
+ if (strncmp(
+ (char *) ((XADataLocator_URI*) (ctx->xaSink->pLocator))->URI,
+ "file:///", 8) == 0)
+ {
+ fname
+ = (char *) &(((XADataLocator_URI*) (ctx->xaSink->pLocator))->URI[8]);
+ }
else
- {
- fname = (char *) ((XADataLocator_URI*) (ctx->xaSink->pLocator))->URI;
- }
+ {
+ fname
+ = (char *) ((XADataLocator_URI*) (ctx->xaSink->pLocator))->URI;
+ }
+
if (remove(fname) != 0)
- {
- DEBUG_ERR_A1("Cannot remove file %s", fname);
+ {
+ DEBUG_ERR_A1_STR("Cannot remove file %s", (char *)fname);
+ }
}
}
- }
- if (ctx->isobjvsrc && ctx->videosource)
- { /* external source, unlink now */
- gst_element_unlink(ctx->videosource, ctx->codecbin);
- GST_OBJECT_FLAG_SET(GST_OBJECT(ctx->videosource),GST_OBJECT_FLOATING);
- }
if (bCtx->bus)
- {
+ {
gst_bus_remove_signal_watch(bCtx->bus);
- }
+ }
XAAdaptationGst_CancelAsyncWait(bCtx);
if (ctx->runpositiontimer)
- {
+ {
g_source_remove(ctx->runpositiontimer);
- }
-
+ }
+
XAAdaptationGst_Free(bCtx);
free(ctx);
ctx = NULL;
DEBUG_API("<-XAMediaRecorderAdapt_Destroy");
-}
+ }
/***************** INTERNAL FUNCTIONS *******************************/
-/*
- * void XAMediaRecorderAdapt_CreatePipeline( XAMediaRecorderAdaptationCtx* ctx );
- */
+ /*
+ * void XAMediaRecorderAdapt_CreatePipeline( XAMediaRecorderAdaptationCtx* ctx );
+ */
XAresult XAMediaRecorderAdapt_CreatePipeline(
XAMediaRecorderAdaptationCtx* ctx)
-{
+ {
XAresult ret = XA_RESULT_SUCCESS;
DEBUG_API("->XAMediaRecorderAdapt_CreatePipeline");
/* Create the audio src */
if ( ctx->xaAudioSource )
- {
+ {
/* create audio pipe source */
ctx->audiosource = XAAdaptationGst_CreateGstSource( ctx->xaAudioSource, "audiosource",
- &(ctx->isobjasrc), NULL, NULL );
-
+ NULL );
+
if( ctx->audiosource )
- {
+ {
if (gst_bin_add(GST_BIN(ctx->baseObj.bin), ctx->audiosource))
- {
+ {
DEBUG_API("Added audiosource to bin");
- }
+ }
else
- {
+ {
DEBUG_API("Could not add audiosource to bin");
return XA_RESULT_INTERNAL_ERROR;
+ }
+ }
+ else
+ {
+ DEBUG_ERR("Could not create audio source!!!!");
+ return XA_RESULT_INTERNAL_ERROR;
}
}
- else
- {
- DEBUG_ERR("Could not create audio source!!!!");
- return XA_RESULT_INTERNAL_ERROR;
- }
- }
/* create and add video pipeline */
ctx->codecbin = XAMediaRecorderAdapt_CreateEncodeBin(ctx);
if (ctx->codecbin)
- {
+ {
if (gst_bin_add(GST_BIN(ctx->baseObj.bin), ctx->codecbin))
- {
+ {
DEBUG_API("->XAMediaRecorderAdapt_CreatePipeline: gst_bin_add success");
- }
+ }
else
- {
+ {
DEBUG_ERR("Could not add codec bin");
return XA_RESULT_INTERNAL_ERROR;
+ }
}
- }
else
- {
+ {
DEBUG_ERR("Could not create encoding bin!!!");
return XA_RESULT_INTERNAL_ERROR;
- }
-
- /* create and add video pipeline if video source available and codec supports video */
- if (ctx->xaVideoSource
- && gst_element_get_pad(ctx->codecbin, "v_sink"))
- {
- /* create video pipe source */
- ctx->videosource = XAAdaptationGst_CreateGstSource(
- ctx->xaVideoSource, "videosource", &(ctx->isobjvsrc),
- NULL, NULL );
- if (!ctx->videosource)
- {
- DEBUG_ERR("Could not create video source!!!!");
- return XA_RESULT_INTERNAL_ERROR;
}
- if (!ctx->isobjvsrc)
- { /* Add other than camera sources to media recorder bin */
- gst_bin_add(GST_BIN(ctx->baseObj.bin), ctx->videosource);
- }
- else
- { /* Don't add camera source to media recorder bin */
- GstCaps * encSrcCaps;
- encSrcCaps = gst_caps_new_simple( "video/x-raw-yuv",
- "format", GST_TYPE_FOURCC,GST_MAKE_FOURCC('I','4','2','0'),
- "framerate", GST_TYPE_FRACTION, ctx->videoEncSettings.frameRate, 1,
- NULL);
- DEBUG_INFO_A1("new camera encoding filter: %s",gst_caps_to_string(encSrcCaps));
- g_object_set( G_OBJECT(ctx->videosource), "filter-caps",encSrcCaps,NULL);
- gst_caps_unref(encSrcCaps);
- }
- /* create video filter for video encoder settings */
- ctx->videofilter = gst_element_factory_make("capsfilter", "videofilter");
- if( ctx->videofilter )
- {
- GstCaps* encSrcCaps;
- gst_bin_add(GST_BIN(ctx->baseObj.bin), ctx->videofilter);
- encSrcCaps = gst_caps_new_simple("video/x-raw-yuv",
- "width", G_TYPE_INT, ctx->videoEncSettings.width,
- "height", G_TYPE_INT, ctx->videoEncSettings.height,
- "framerate", GST_TYPE_FRACTION, ctx->videoEncSettings.frameRate, 1,
- NULL);
- DEBUG_INFO_A1("video encoder config from settings: %s",gst_caps_to_string(encSrcCaps));
- g_object_set( G_OBJECT(ctx->videofilter), "caps",encSrcCaps,NULL);
- gst_caps_unref(encSrcCaps);
- if ( ! ctx->isobjvsrc )
- {
- if(!gst_element_link(ctx->videosource, ctx->videofilter))
- {
- DEBUG_ERR("Could not link videopp to videofilter!!");
- return XA_RESULT_INTERNAL_ERROR;
- }
- }
- else
- { /* For camera source used ghost-pads for linking, because elements are in different bins */
- GstStateChangeReturn gret;
- GstElement *camTee=NULL;
- GstPad *cameraBinGhostPad=NULL;
- GstPad *ghost=NULL;
- GstPad *mrGhostSink=NULL;
-
- DEBUG_INFO("Set ext-source PAUSED for pipeline manipulation");
- gret = gst_element_set_state( GST_ELEMENT(ctx->videosource), GST_STATE_READY);
- if(gret == GST_STATE_CHANGE_SUCCESS)
- {
- gret = gst_element_get_state( GST_ELEMENT(ctx->videosource), NULL,NULL,XA_ADAPT_ASYNC_TIMEOUT_SHORT_NSEC);
- }
-
- /* Add new ghost-pad to external camera source */
- camTee = gst_bin_get_by_name( GST_BIN(ctx->videosource), "CamTee");
- if ( !camTee )
- {
- DEBUG_ERR("Could not get tee-element from camera");
- }
- cameraBinGhostPad = gst_element_get_request_pad( camTee, "src%d" );
- if ( !cameraBinGhostPad )
- {
- DEBUG_ERR("Could not get new src-pad from CamTee element");
- }
- gst_element_add_pad(ctx->videosource, gst_ghost_pad_new("MRObjSrc",cameraBinGhostPad));
- ghost = gst_element_get_static_pad( GST_ELEMENT(ctx->videosource), "MRObjSrc" );
- DEBUG_INFO_A2("Setting element:%s pad:%s to blocking.",
- gst_element_get_name(ctx->baseObj.bin),
- gst_pad_get_name(ghost));
- /* Set newly created pad to blocking */
- gst_pad_set_blocked_async(ghost, TRUE, XAAdaptationGst_PadBlockCb, NULL);
-
- mrGhostSink = gst_element_get_static_pad( GST_ELEMENT(ctx->videofilter), "sink");
- gst_element_add_pad(ctx->baseObj.bin, gst_ghost_pad_new("MRObjSink",mrGhostSink));
- if ( !gst_element_link_pads( GST_ELEMENT(ctx->videosource), "MRObjSrc",
- GST_ELEMENT(ctx->baseObj.bin), "MRObjSink") )
- {
- DEBUG_ERR("Could not link camera:MRObjSrc to videofilter:MRObjSink");
- return XA_RESULT_INTERNAL_ERROR;
- }
-
- if ( cameraBinGhostPad )
- {
- gst_object_unref( cameraBinGhostPad );
- }
- if ( ghost )
- {
- gst_object_unref( ghost );
- }
- if ( mrGhostSink )
- {
- gst_object_unref( mrGhostSink );
- }
- if ( camTee )
- {
- gst_object_unref( camTee );
- }
- }
- }
- /* create video processing pipeline */
-#ifdef XA_IMPL_FIXED_VIDEO_SIZE
- ctx->videoppbin = XAAdaptationGst_CreateFixedSizeVideoPP( );
-#else
- ctx->videoppbin = XAAdaptationGst_CreateVideoPP( );
-#endif
- if( ctx->videoppbin )
- {
- gst_bin_add(GST_BIN(ctx->baseObj.bin), ctx->videoppbin);
- if(!gst_element_link(ctx->videofilter, ctx->videoppbin))
- {
- DEBUG_ERR("Could not link videofilter to videopp!!");
- return XA_RESULT_INTERNAL_ERROR;
- }
- }
- else
- {
- DEBUG_ERR("Could not create video pp bin!!!!");
- return XA_RESULT_INTERNAL_ERROR;
- }
- /* create identity to extract buffers from */
- ctx->videoextract = gst_element_factory_make("identity", "videoextract");
- if( ctx->videoextract )
- {
- gst_bin_add(GST_BIN(ctx->baseObj.bin), ctx->videoextract);
- if(!gst_element_link(ctx->videoppbin, ctx->videoextract))
- {
- DEBUG_ERR("Could not link videopp to videoextract!!");
- return XA_RESULT_INTERNAL_ERROR;
- }
- }
- else
- {
- DEBUG_ERR("Could not create videoextract!!!!");
- return XA_RESULT_INTERNAL_ERROR;
- }
- if( ctx->videoextract )
- {
- if( !gst_element_link_pads(ctx->videoextract, "src", ctx->codecbin, "v_sink") )
- {
- DEBUG_INFO("Warning: could not link videoextract to codec!!");
- }
- }
- }
- else
- {
- DEBUG_INFO("No video input");
- }
-
/* create and add audio pipeline */
if ( ctx->audiosource )
- {
-#ifdef USE_AUDIO_PP
- /* create audio processing pipeline */
- ctx->audioppbin = XAAdaptationGst_CreateAudioPP( );
- if( ctx->audioppbin )
- {
- if (gst_bin_add(GST_BIN(ctx->baseObj.bin), ctx->audioppbin))
- {
- DEBUG_INFO("Added audioppbin to bin");
- }
- else
- {
- DEBUG_ERR("Could not add audioppbin to bin");
- return XA_RESULT_INTERNAL_ERROR;
- }
- if(!gst_element_link(ctx->audiosource, ctx->audioppbin))
+ {
+ //if(!gst_element_link(ctx->audiofilter, ctx->codecbin ))
+ if(!gst_element_link(ctx->audiosource, ctx->codecbin ))
{
- DEBUG_ERR("Could not link audiofilter to audiopp!!");
- return XA_RESULT_INTERNAL_ERROR;
- }
- }
- else
- {
- DEBUG_ERR("Could not create audio pp bin!!!!");
- return XA_RESULT_INTERNAL_ERROR;
- }
-#endif //USE_AUDIO_PP
-
- /* create audio filter for audio encoder settings */
-
-// ret = XAMediaRecorderAdapt_CreateCapsFilter(ctx);
-//
-// if ( XA_RESULT_SUCCESS != ret )
-// {
-// DEBUG_ERR("cannot create caps filter");
-// return ret;
-// }
-//
-// /*LINK : audiosource -> audiofilter */
-// if(!gst_element_link(ctx->audiosource, ctx->audiofilter))
-// {
-// DEBUG_ERR("Could not link audiosource to audiofilter!!");
-// return XA_RESULT_INTERNAL_ERROR;
-// }
-
-/* if( !gst_element_link_pads_filtered(ctx->audiofilter, "src", ctx->codecbin, "sink", encSrcCaps) )
- {
- DEBUG_INFO("Warning: could not link audiopp to codec!!");
+ DEBUG_ERR("Could not link audiosource to codecbin!!");
return XA_RESULT_INTERNAL_ERROR;
}
-*/
-#ifdef USE_AUDIO_PP
- if (!gst_element_link_filtered( ctx->audiofilter , ctx->audioppbin ,encSrcCaps))
+ else
{
- DEBUG_INFO("Warning: could not link audiosource to audiopp!!");
- return XA_RESULT_INTERNAL_ERROR;
- }
- if(!gst_element_link(ctx->audioppbin, ctx->codecbin))
- {
- DEBUG_INFO("Warning: could not link audioppbin to codecbin!!");
- return XA_RESULT_INTERNAL_ERROR;
+ DEBUG_INFO("Warning: link audiosource to codecbin is successfull with muxcaps!!");
}
-#else
- //if(!gst_element_link(ctx->audiofilter, ctx->codecbin ))
- if(!gst_element_link(ctx->audiosource, ctx->codecbin ))
- {
- DEBUG_ERR("Could not link audiosource to codecbin!!");
- return XA_RESULT_INTERNAL_ERROR;
}
- else
+ else
{
- DEBUG_INFO("Warning: link audiosource to codecbin is successfull with muxcaps!!");
+ DEBUG_INFO("No audio input");
}
-#endif // USE_AUDIO_PP
- }
- else
- {
- DEBUG_INFO("No audio input");
- }
/* create and add data sink */
- ctx->datasink = XAAdaptationGst_CreateGstSink( ctx->xaSink, "datasink", &(ctx->isobjsink) );
+ ctx->datasink = XAAdaptationGst_CreateGstSink( ctx->xaSink, "datasink" );
if( ctx->datasink )
- {
- if ( GST_IS_APP_SINK(ctx->datasink) )
{
- gst_app_sink_set_emit_signals( GST_APP_SINK(ctx->datasink), TRUE );
- }
if (gst_bin_add(GST_BIN(ctx->baseObj.bin), ctx->datasink))
- {
+ {
DEBUG_INFO("Added datasink to bin");
- }
+ }
else
- {
+ {
DEBUG_ERR("Could not add datasink to bin");
return XA_RESULT_INTERNAL_ERROR;
- }
+ }
if(!gst_element_link(ctx->codecbin, ctx->datasink))
- {
+ {
DEBUG_ERR("Could not link codec to sink!!");
return XA_RESULT_INTERNAL_ERROR;
+ }
}
- /* NOTE: no actual object sinks applicable, variable used to imply appsrc (recording to memory)*/
- if(ctx->isobjsink)
+ else
{
- g_signal_connect(ctx->datasink, "new-buffer",
- G_CALLBACK (XAMediaRecorderAdapt_BufferAvailable),ctx);
-
- ret = XAImpl_CreateSemaphore( &(ctx->recThrCtx.bufInsufficientSem));
- if ( ret != XA_RESULT_SUCCESS )
- {
- DEBUG_ERR("WARN: Could not create semaphore for recorder event handler!");
- }
- XAImpl_CreateThreadHandle( &(ctx->recordingEventThr) );
- }
- }
- else
- {
DEBUG_ERR("Could not create data sink!!!");
return XA_RESULT_INTERNAL_ERROR;
- }
+ }
DEBUG_API("<-XAMediaRecorderAdapt_CreatePipeline");
return ret;
-}
+ }
/*
* XAresult XAMediaRecorderAdapt_CheckCodec( XAMediaRecorderAdaptationCtx_* mCtx );
@@ -730,7 +480,7 @@
XAresult XAMediaRecorderAdapt_CheckCodec( XAMediaRecorderAdaptationCtx_* mCtx, XACapsType encType, XAuint32 encoderId )
{
XAresult ret = XA_RESULT_SUCCESS;
- XAuint32 format;
+ XAuint32 format = 0;
XACapabilities temp;
DEBUG_API("->XAMediaRecorderAdapt_CheckCodec");
@@ -739,257 +489,138 @@
ret = XACapabilitiesMgr_GetCapsById(mCtx->baseObj.baseObj.capslist,(XACapsType)(XACAP_ENCODER|encType), encoderId, &temp);
if( ret==XA_RESULT_SUCCESS )
- {
+ {
if(encType & (XACAP_VIDEO|XACAP_AUDIO))
- {
- if(mCtx->xaSink && mCtx->xaSink->pFormat)
{
+ if(mCtx->xaSink && mCtx->xaSink->pFormat)
+ {
format = *(XAuint32*)(mCtx->xaSink->pFormat);
- }
+ }
else
- {
+ {
ret=XA_RESULT_FEATURE_UNSUPPORTED;
+ }
}
- }
- else
- {
- if(mCtx->snapshotVars.xaSink && mCtx->snapshotVars.xaSink->pFormat)
- {
- format = *(XAuint32*)(mCtx->snapshotVars.xaSink->pFormat);
- }
- else
- {
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- }
- }
+
if(ret==XA_RESULT_SUCCESS)
- {
- switch ( format )
- {
- case XA_DATAFORMAT_PCM:
- if ( (encType == XACAP_AUDIO) && (encoderId == XA_AUDIOCODEC_PCM) )
- {
- ret=XA_RESULT_SUCCESS;
- }
- else
- {
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- }
- break;
-
- case XA_DATAFORMAT_RAWIMAGE:
- if ( (encType == XACAP_IMAGE) && (encoderId == XA_IMAGECODEC_RAW) )
- {
- ret=XA_RESULT_SUCCESS;
- }
- else
- {
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- }
- break;
-
- case XA_DATAFORMAT_MIME:
- DEBUG_INFO("XA_DATAFORMAT_MIME ");
+ {
+ switch ( format )
{
- XADataFormat_MIME* mime = ((XADataFormat_MIME*)mCtx->xaSink->pFormat);
- DEBUG_INFO_A1("mime->containerType:%u",(int)mime->containerType);
- DEBUG_INFO_A1("mime->mimeType:%s",mime->mimeType);
- switch ( mime->containerType )
- {
- case XA_CONTAINERTYPE_RAW:
- if( ((encType == XACAP_AUDIO) && (encoderId == XA_AUDIOCODEC_PCM)) ||
- ((encType == XACAP_VIDEO) && (encoderId == XA_ADAPTID_RAWVIDEO)) ||
- ((encType == XACAP_IMAGE) && (encoderId == XA_IMAGECODEC_RAW)) )
+ case XA_DATAFORMAT_PCM:
+ if ( (encType == XACAP_AUDIO) && (encoderId == XA_AUDIOCODEC_PCM) )
+ {
+ ret=XA_RESULT_SUCCESS;
+ }
+ else
{
- ret=XA_RESULT_SUCCESS;
+ ret=XA_RESULT_FEATURE_UNSUPPORTED;
}
- else
+ break;
+
+ case XA_DATAFORMAT_MIME:
+ DEBUG_INFO("XA_DATAFORMAT_MIME ");
{
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- }
- break;
-
- case XA_CONTAINERTYPE_AVI:
- if(encType == XACAP_VIDEO)
- {
- switch(encoderId)
+ XADataFormat_MIME* mime = ((XADataFormat_MIME*)mCtx->xaSink->pFormat);
+ DEBUG_INFO_A1("mime->containerType:%u",(int)mime->containerType);
+ DEBUG_INFO_A1_STR("mime->mimeType:%s", (char *)mime->mimeType);
+ switch ( mime->containerType )
{
- case XA_ADAPTID_MOTIONJPEG:
- case XA_ADAPTID_RAWVIDEO:
- ret=XA_RESULT_SUCCESS;
- break;
- default:
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
+ case XA_CONTAINERTYPE_RAW:
+ if((encType == XACAP_AUDIO) && (encoderId == XA_AUDIOCODEC_PCM))
+ {
+ ret=XA_RESULT_SUCCESS;
+ }
+ else
+ {
+ ret=XA_RESULT_FEATURE_UNSUPPORTED;
+ }
break;
- }
- }
- else if(encType == XACAP_AUDIO)
- {
- switch(encoderId)
- {
- case XA_AUDIOCODEC_PCM:
- ret=XA_RESULT_SUCCESS;
+
+ case XA_CONTAINERTYPE_WAV:
+ if(encType == XACAP_AUDIO)
+ {
+ switch(encoderId)
+ {
+ case XA_AUDIOCODEC_PCM:
+ ret=XA_RESULT_SUCCESS;
+ break;
+ default:
+ ret=XA_RESULT_FEATURE_UNSUPPORTED;
+ break;
+ }
+ }
+ else
+ {
+ ret=XA_RESULT_FEATURE_UNSUPPORTED;
+ }
break;
- default:
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
+
+ case XA_CONTAINERTYPE_UNSPECIFIED:
+ {
+ ret=XA_RESULT_FEATURE_UNSUPPORTED;
+ }
break;
- }
- }
- else
- {
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- }
- break;
-
- case XA_CONTAINERTYPE_WAV:
- if(encType == XACAP_AUDIO)
- {
- switch(encoderId)
- {
- case XA_AUDIOCODEC_PCM:
- ret=XA_RESULT_SUCCESS;
+ case XA_CONTAINERTYPE_AMR:
+ if(encType == XACAP_AUDIO)
+ {
+ switch(encoderId)
+ {
+ case XA_AUDIOCODEC_AMR:
+ ret=XA_RESULT_SUCCESS;
+ break;
+ default:
+ ret=XA_RESULT_FEATURE_UNSUPPORTED;
+ break;
+ }
+ }
+ else
+ {
+ ret=XA_RESULT_FEATURE_UNSUPPORTED;
+ }
break;
- default:
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
+ case XA_CONTAINERTYPE_MP4:
+ if(encType == XACAP_AUDIO )
+ {
+ switch(encoderId)
+ {
+ case XA_AUDIOCODEC_AAC:
+ ret=XA_RESULT_SUCCESS;
+ break;
+ default:
+ ret=XA_RESULT_FEATURE_UNSUPPORTED;
+ break;
+ }
+ }
+ else
+ {
+ ret=XA_RESULT_FEATURE_UNSUPPORTED;
+ }
+ break;
+ default: /*switch (containertype)*/
+ ret = XA_RESULT_FEATURE_UNSUPPORTED;
break;
}
- }
- else
- {
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- }
break;
-
- case XA_CONTAINERTYPE_JPG:
- if(encType == XACAP_VIDEO)
- {
- switch(encoderId)
- {
- case XA_ADAPTID_MOTIONJPEG:
- ret=XA_RESULT_SUCCESS;
- break;
- default:
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- break;
- }
- }
- else if(encType == XACAP_IMAGE)
- {
- switch(encoderId)
- {
- case XA_IMAGECODEC_JPEG:
- ret=XA_RESULT_SUCCESS;
- break;
- default:
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- break;
- }
- }
- else
- {
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
}
- break;
-
- case XA_CONTAINERTYPE_UNSPECIFIED:
- if(strstr( (char *) mime->mimeType, "/ogg") != 0)
- {
- if(encType == XACAP_VIDEO)
- {
- switch(encoderId)
- {
- case XA_ADAPTID_THEORA:
- ret=XA_RESULT_SUCCESS;
- break;
- default:
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- break;
- }
- }
- else if(encType == XACAP_AUDIO)
- {
- switch(encoderId)
- {
- case XA_ADAPTID_VORBIS:
- ret=XA_RESULT_SUCCESS;
- break;
- default:
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- break;
- }
- }
- else
- {
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- }
- }
- else
- {
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- }
- break;
- case XA_CONTAINERTYPE_AMR:
- if(encType == XACAP_AUDIO)
- {
- switch(encoderId)
- {
- case XA_AUDIOCODEC_AMR:
- ret=XA_RESULT_SUCCESS;
- break;
- default:
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- break;
- }
- }
- else
- {
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- }
- break;
- case XA_CONTAINERTYPE_MP4:
- if(encType == XACAP_AUDIO )
- {
- switch(encoderId)
- {
- case XA_AUDIOCODEC_AAC:
- ret=XA_RESULT_SUCCESS;
- break;
- default:
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- break;
- }
- }
- else
- {
- ret=XA_RESULT_FEATURE_UNSUPPORTED;
- }
- break;
- default: /*switch (containertype)*/
- ret = XA_RESULT_FEATURE_UNSUPPORTED;
- break;
- }
+ default: /*switch (format)*/
+ ret = XA_RESULT_FEATURE_UNSUPPORTED;
break;
}
- default: /*switch (format)*/
- ret = XA_RESULT_CONTENT_UNSUPPORTED;
- break;
}
}
- }
if( ret!=XA_RESULT_SUCCESS )
- {
+ {
DEBUG_ERR("cannot accommodate given codec & datasink pair!!!");
- }
+ }
DEBUG_API("<-XAMediaRecorderAdapt_CheckCodec");
return ret;
-}
-
+ }
/*
* XAresult XAMediaRecorderAdapt_ChangeEncoders( XAMediaRecorderAdaptationCtx* mCtx );
* re-create encodebin based on new encoder settings
*/
XAresult XAMediaRecorderAdapt_ChangeEncoders( XAMediaRecorderAdaptationCtx* mCtx )
-{
+ {
XAresult ret = XA_RESULT_SUCCESS;
GstElement *encoderelement = NULL;
XAAdaptationGstCtx* bCtx = &(mCtx->baseObj);
@@ -997,15 +628,13 @@
DEBUG_API("->XAMediaRecorderAdapt_ChangeEncoders");
/* check state */
if(GST_STATE(mCtx->baseObj.bin)<GST_STATE_PLAYING)
- {
+ {
GstElement* newBin = XAMediaRecorderAdapt_CreateEncodeBin(mCtx);
if(newBin)
- { /* replace old bin with new */
+ { /* replace old bin with new */
GstStateChangeReturn gret;
GstPad *asink=NULL, *linkedasrc=NULL;
- GstPad *vsink=NULL, *linkedvsrc=NULL;
GstPad *src=NULL, *linkedsink=NULL;
- GstPad *moSrc=NULL, *moSink=NULL;
GstCaps* encSrcCaps = NULL;
GstPad *afiltsrc=NULL, *afiltsink=NULL;
@@ -1013,106 +642,75 @@
DEBUG_INFO("Unroll pipeline");
bCtx->binWantedState = GST_STATE_READY;
gret = gst_element_set_state( GST_ELEMENT(bCtx->bin), bCtx->binWantedState);
+ if(gret == GST_STATE_CHANGE_FAILURE)
+ {
+ DEBUG_ERR("Failed to Unroll Pipeline!!");
+ return XA_RESULT_INTERNAL_ERROR;
+ }
+
gret = gst_element_get_state( GST_ELEMENT(bCtx->bin), NULL, NULL, XA_ADAPT_ASYNC_TIMEOUT_SHORT_NSEC);
- /*set new stream settings*/
- if( mCtx->videofilter )
- {
- encSrcCaps = gst_caps_new_simple("video/x-raw-yuv",
- "format", GST_TYPE_FOURCC,GST_MAKE_FOURCC('I','4','2','0'),
- "width", G_TYPE_INT, mCtx->videoEncSettings.width,
- "height", G_TYPE_INT, mCtx->videoEncSettings.height,
- "framerate", GST_TYPE_FRACTION, mCtx->videoEncSettings.frameRate, 1,
- NULL);
- DEBUG_INFO_A1("new video encoder config from settings: %s",gst_caps_to_string(encSrcCaps));
- g_object_set( G_OBJECT(mCtx->videofilter), "caps",encSrcCaps,NULL);
- gst_caps_unref(encSrcCaps);
- }
if(!mCtx ->audiofilter)
- {
- //creating caps filter
- mCtx->audiofilter = gst_element_factory_make("capsfilter", "audiofilter");
- if ( mCtx->audiofilter )
- {
- gst_bin_add(GST_BIN(bCtx->bin), mCtx->audiofilter);
- encSrcCaps = gst_caps_new_full(
- gst_structure_new("audio/x-raw-int",
- "channels", G_TYPE_INT, mCtx->audioEncSettings.channelsOut,
- "rate", G_TYPE_INT, (mCtx->audioEncSettings.sampleRate / 1000),
- "depth", G_TYPE_INT, mCtx->audioEncSettings.bitsPerSample,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, mCtx->audioEncSettings.blockAlignment,
- NULL),
- gst_structure_new("audio/amr",
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, mCtx->audioEncSettings.blockAlignment,
- "depth", G_TYPE_INT, mCtx->audioEncSettings.bitsPerSample,
- "rate", G_TYPE_INT, (mCtx->audioEncSettings.sampleRate / 1000),
- "channels", G_TYPE_INT, mCtx->audioEncSettings.channelsOut,
- NULL),
- gst_structure_new("audio/x-raw-float",
- "channels", G_TYPE_INT, mCtx->audioEncSettings.channelsOut,
- "width", G_TYPE_INT, mCtx->audioEncSettings.bitsPerSample,
- "rate", G_TYPE_INT , mCtx->audioEncSettings.sampleRate / 1000,
- NULL),
- NULL);
- DEBUG_INFO_A1("new audio encoder config from settings: %s",gst_caps_to_string(encSrcCaps));
- g_object_set( G_OBJECT(mCtx->audiofilter), "caps",encSrcCaps,NULL);
+ {
+ //creating caps filter
+ mCtx->audiofilter = gst_element_factory_make("capsfilter", "audiofilter");
+ if ( mCtx->audiofilter )
+ {
+ gst_bin_add(GST_BIN(bCtx->bin), mCtx->audiofilter);
+ encSrcCaps = gst_caps_new_full(
+ gst_structure_new("audio/x-raw-int",
+ "channels", G_TYPE_INT, mCtx->audioEncSettings.channelsOut,
+ "rate", G_TYPE_INT, (mCtx->audioEncSettings.sampleRate / 1000),
+ "depth", G_TYPE_INT, mCtx->audioEncSettings.bitsPerSample,
+ "signed",G_TYPE_BOOLEAN, TRUE,
+ "endianness",G_TYPE_INT, mCtx->audioEncSettings.blockAlignment,
+ NULL),
+ gst_structure_new("audio/amr",
+ "signed",G_TYPE_BOOLEAN, TRUE,
+ "endianness",G_TYPE_INT, mCtx->audioEncSettings.blockAlignment,
+ "depth", G_TYPE_INT, mCtx->audioEncSettings.bitsPerSample,
+ "rate", G_TYPE_INT, (mCtx->audioEncSettings.sampleRate / 1000),
+ "channels", G_TYPE_INT, mCtx->audioEncSettings.channelsOut,
+ NULL),
+ gst_structure_new("audio/x-raw-float",
+ "channels", G_TYPE_INT, mCtx->audioEncSettings.channelsOut,
+ "width", G_TYPE_INT, mCtx->audioEncSettings.bitsPerSample,
+ "rate", G_TYPE_INT , mCtx->audioEncSettings.sampleRate / 1000,
+ NULL),
+ NULL);
+ DEBUG_INFO_A1_STR("new audio encoder config from settings: %s",gst_caps_to_string(encSrcCaps));
+ g_object_set( G_OBJECT(mCtx->audiofilter), "caps",encSrcCaps,NULL);
+
+ gst_caps_unref(encSrcCaps);
- gst_caps_unref(encSrcCaps);
- }
- else
- {
- DEBUG_ERR("cannot create caps filter");
- return XA_RESULT_INTERNAL_ERROR;
+ }else
+ {
+ DEBUG_ERR("cannot create caps filter");
+ return XA_RESULT_INTERNAL_ERROR;
+ }
+
}
- }
-
- if(mCtx->isobjvsrc)
- {
- moSrc = gst_element_get_static_pad(mCtx->videosource,"MRObjSrc");
- moSink = gst_pad_get_peer(moSrc);
- if(moSink)
- {
- gst_pad_unlink(moSrc,moSink);
- }
- encSrcCaps = gst_caps_new_simple("video/x-raw-yuv",
- "format", GST_TYPE_FOURCC,GST_MAKE_FOURCC('I','4','2','0'),
- "framerate", GST_TYPE_FRACTION, mCtx->videoEncSettings.frameRate, 1,
- NULL);
- DEBUG_INFO_A1("new camera encoding filter: %s",gst_caps_to_string(encSrcCaps));
- g_object_set( G_OBJECT(mCtx->videosource), "filter-caps",encSrcCaps,NULL);
- gst_caps_unref(encSrcCaps);
- }
DEBUG_INFO("Unlink and remove old encodebin");
asink = gst_element_get_static_pad(mCtx->codecbin,"sink");
if(asink)
- {
+ {
linkedasrc = gst_pad_get_peer(asink);
if(linkedasrc)
- {
+ {
gst_pad_unlink(linkedasrc,asink);
+ }
}
- }
- vsink = gst_element_get_static_pad(mCtx->codecbin,"v_sink");
- if(vsink)
- {
- linkedvsrc = gst_pad_get_peer(vsink);
- if(linkedvsrc)
- {
- gst_pad_unlink(linkedvsrc,vsink);
- }
- }
+
src = gst_element_get_static_pad(mCtx->codecbin,"src");
if(src)
- {
+ {
linkedsink = gst_pad_get_peer(src);
if(linkedsink)
- {
+ {
gst_pad_unlink(src,linkedsink);
+ }
}
- }
gst_element_set_state( GST_ELEMENT(mCtx->codecbin), GST_STATE_NULL );
gst_element_get_state( GST_ELEMENT(mCtx->codecbin),NULL,NULL,1000 );
@@ -1129,111 +727,73 @@
afiltsink = gst_element_get_static_pad(mCtx->audiofilter,"sink");
afiltsrc = gst_element_get_static_pad(mCtx->audiofilter,"src");
if(linkedasrc && afiltsink)
- {
- if(gst_pad_link(linkedasrc , afiltsink ) != GST_PAD_LINK_OK)
- {
- DEBUG_ERR("Could not link audiosource to audiofilter!!");
- return XA_RESULT_INTERNAL_ERROR;
- }
- }
- if(asink && afiltsrc)
- {
- if(gst_pad_link(afiltsrc , asink) != GST_PAD_LINK_OK)
{
- DEBUG_ERR("Could not link audiosource to audiofilter!!");
- return XA_RESULT_INTERNAL_ERROR;
+ if(gst_pad_link(linkedasrc , afiltsink ) != GST_PAD_LINK_OK)
+ {
+ DEBUG_ERR("Could not link audiosource to audiofilter!!");
+ return XA_RESULT_INTERNAL_ERROR;
+ }
}
- }
- vsink = gst_element_get_static_pad(mCtx->codecbin,"v_sink");
- if(vsink && linkedvsrc)
- {
- if(gst_pad_link(linkedvsrc,vsink) != GST_PAD_LINK_OK)
+ if(asink && afiltsrc)
+ {
+ if(gst_pad_link(afiltsrc , asink) != GST_PAD_LINK_OK)
{
- DEBUG_ERR("Could not link linkedvsrc to vsink!!");
- return XA_RESULT_INTERNAL_ERROR;
+ DEBUG_ERR("Could not link audiosource to audiofilter!!");
+ return XA_RESULT_INTERNAL_ERROR;
}
- }
+ }
src = gst_element_get_static_pad(mCtx->codecbin,"src");
if(src && linkedsink)
- {
- if(gst_pad_link(src,linkedsink) != GST_PAD_LINK_OK)
{
- DEBUG_ERR("Could not link codecbin src pad to linkedsink!!");
- return XA_RESULT_INTERNAL_ERROR;
+ if(gst_pad_link(src,linkedsink) != GST_PAD_LINK_OK)
+ {
+ DEBUG_ERR("Could not link codecbin src pad to linkedsink!!");
+ return XA_RESULT_INTERNAL_ERROR;
+ }
}
- }
-
- if(mCtx->isobjvsrc)
- {
- moSrc = gst_element_get_static_pad(mCtx->videosource,"MRObjSrc");
- if(moSink&&moSrc)
- {
- if(gst_pad_link(moSrc,moSink) != GST_PAD_LINK_OK)
- {
- DEBUG_ERR("Could not link codecbin src pad to linkedsink!!");
- return XA_RESULT_INTERNAL_ERROR;
- }
- }
- }
-
//setting the Bitrate and other properties for elements
- if(mCtx->audioEncSettings.encoderId == XA_AUDIOCODEC_AAC)
- {
- encoderelement = gst_bin_get_by_name((GstBin*)mCtx->codecbin, "audioenc") ;
- if(encoderelement)
- {
- g_object_set(G_OBJECT(encoderelement),"bitrate" , mCtx->audioEncSettings.bitRate , NULL );
- g_object_set(G_OBJECT(encoderelement),"profile", mCtx->audioEncSettings.levelSetting , NULL );
- g_object_set(G_OBJECT(encoderelement),"output-format", mCtx->audioEncSettings.streamFormat , NULL );
- gst_object_unref (encoderelement);
- }
- else
- {
- DEBUG_ERR("Encoder Element not found for AAC");
- }
+ if(mCtx->audioEncSettings.encoderId == XA_AUDIOCODEC_AAC)
+ {
+ encoderelement = gst_bin_get_by_name((GstBin*)mCtx->codecbin, "audioenc") ;
+ if(encoderelement)
+ {
+ g_object_set(G_OBJECT(encoderelement),"bitrate" , mCtx->audioEncSettings.bitRate , NULL );
+ g_object_set(G_OBJECT(encoderelement),"profile", mCtx->audioEncSettings.levelSetting , NULL );
+ g_object_set(G_OBJECT(encoderelement),"output-format", mCtx->audioEncSettings.streamFormat , NULL );
+ gst_object_unref (encoderelement);
+ }
+ else
+ {
+ DEBUG_ERR("Encoder Element not found for AAC");
+ }
+ }
+ else if(mCtx->audioEncSettings.encoderId == XA_AUDIOCODEC_AMR)
+ {
+ g_object_set(G_OBJECT(mCtx->audiosource),"speechbitrate", mCtx->audioEncSettings.bitRate , NULL );
+ }
+ else
+ {
+ DEBUG_INFO("No properties for PCM or Wav");
+ }
+
+ DEBUG_INFO_A1_STR("Pipeline in state %s",gst_element_state_get_name(GST_STATE(bCtx->bin)));
}
- else if(mCtx->audioEncSettings.encoderId == XA_AUDIOCODEC_AMR)
- {
- g_object_set(G_OBJECT(mCtx->audiosource),"speechbitrate", mCtx->audioEncSettings.bitRate , NULL );
- }
- else
+ else
{
- DEBUG_INFO("No properties for PCM or Wav")
- }
-
- /*re-roll*/
- DEBUG_INFO("Reroll pipeline");
- bCtx->binWantedState = GST_STATE_PAUSED;
- gret = gst_element_set_state( GST_ELEMENT(bCtx->bin), bCtx->binWantedState);
- if( gret == GST_STATE_CHANGE_ASYNC )
- {
- DEBUG_INFO("Wait for reroll");
- XAAdaptationGst_StartAsyncWait(bCtx);
- }
- else if( gret == GST_STATE_CHANGE_FAILURE )
- {
- DEBUG_ERR("reroll FAILED");
- ret = XA_RESULT_INTERNAL_ERROR;
- }
- bCtx->waitingasyncop = XA_BOOLEAN_FALSE;
- DEBUG_INFO_A1("Pipeline in state %s",gst_element_state_get_name(GST_STATE(bCtx->bin)));
- }
- else
- {
/* could not support wanted encoders */
DEBUG_ERR("Failed to create encodebin with new settings, using old one!");
ret = XA_RESULT_FEATURE_UNSUPPORTED;
+ }
}
- }
else
- { /* n/a while playing */
+ { /* n/a while playing */
DEBUG_ERR("Cannot change encoder when recording ongoing!");
ret = XA_RESULT_PRECONDITIONS_VIOLATED;
- }
+ }
DEBUG_API("<-XAMediaRecorderAdapt_ChangeEncoders");
return ret;
-}
+ }
/**
* GstElement* XAMediaRecorderAdapt_CreateEncodeBin( XAMediaRecorderAdaptationCtx* ctx )
@@ -1241,398 +801,173 @@
* Decription: Create encoder/muxer element based on given format and encoder settings
*/
GstElement* XAMediaRecorderAdapt_CreateEncodeBin( XAMediaRecorderAdaptationCtx* ctx )
-{
+ {
XAresult ret = XA_RESULT_SUCCESS;
- GstElement *audioenc = NULL, *videoenc=NULL, *mux=NULL;
+ GstElement *audioenc = NULL, *mux=NULL;
GstElement *codecbin = gst_bin_new( "mrcodecbin" );
- GstPad *ghostsrc = NULL, *ghostaudiosink = NULL, *ghostvideosink = NULL;
+ GstPad *ghostsrc = NULL, *ghostaudiosink = NULL;
XAuint32 format;
XACapabilities temp;
DEBUG_API("->XAMediaRecorderAdapt_CreateEncodeBin");
if(ctx->recModes & XA_RECMODE_STREAM)
- {
+ {
if(ctx->xaSink && ctx->xaSink->pFormat)
- {
+ {
format = *(XAuint32*)(ctx->xaSink->pFormat);
switch ( format )
- {
+ {
case XA_DATAFORMAT_PCM:
- DEBUG_INFO("XA_DATAFORMAT_PCM");
- {
- XADataFormat_PCM* pcm = ((XADataFormat_PCM*)ctx->xaSink->pFormat);
- if(!ctx->xaAudioSource)
- {
- DEBUG_ERR("Unsupported dataformat for given data sources");
- return NULL;
- }
- /* no need for codec, just pass data on */
- mux = gst_element_factory_make("identity", "mux");
- gst_bin_add(GST_BIN(codecbin), mux);
- ghostsrc = gst_element_get_static_pad(mux,"src");
- ghostaudiosink = gst_element_get_static_pad(mux,"sink");
- /*set usable audio settings from the sink structure*/
- ctx->audioEncSettings.encoderId = XA_AUDIOCODEC_PCM;
- ctx->audioEncSettings.channelsOut = pcm->numChannels;
- ctx->audioEncSettings.bitsPerSample = pcm->bitsPerSample;
- }
- break;
-
- case XA_DATAFORMAT_RAWIMAGE:
- DEBUG_INFO("XA_DATAFORMAT_RAWIMAGE");
- {
- XADataFormat_RawImage* img = ((XADataFormat_RawImage*)ctx->xaSink->pFormat);
- if(!ctx->xaVideoSource)
- {
- DEBUG_ERR("Unsupported dataformat for given data sources");
- return NULL;
- }
- /* no need for codec, just pass data on */
- mux = gst_element_factory_make("identity", "mux");
- gst_bin_add(GST_BIN(codecbin), mux);
- ghostsrc = gst_element_get_static_pad(mux,"src");
- ghostvideosink = gst_element_get_static_pad(mux,"sink");
- /*set needed image settings from the sink structure*/
- ctx->imageEncSettings.encoderId = XA_IMAGECODEC_RAW;
- ctx->imageEncSettings.width = img->width;
- ctx->imageEncSettings.height = img->height;
- ctx->imageEncSettings.colorFormat = img->colorFormat;
- }
- break;
+ DEBUG_INFO("XA_DATAFORMAT_PCM");
+ {
+ XADataFormat_PCM* pcm = ((XADataFormat_PCM*)ctx->xaSink->pFormat);
+ if(!ctx->xaAudioSource)
+ {
+ DEBUG_ERR("Unsupported dataformat for given data sources");
+ return NULL;
+ }
+ /* no need for codec, just pass data on */
+ mux = gst_element_factory_make("identity", "mux");
+ gst_bin_add(GST_BIN(codecbin), mux);
+ ghostsrc = gst_element_get_static_pad(mux,"src");
+ ghostaudiosink = gst_element_get_static_pad(mux,"sink");
+ /*set usable audio settings from the sink structure*/
+ ctx->audioEncSettings.encoderId = XA_AUDIOCODEC_PCM;
+ ctx->audioEncSettings.channelsOut = pcm->numChannels;
+ ctx->audioEncSettings.bitsPerSample = pcm->bitsPerSample;
+ }
+ break;
case XA_DATAFORMAT_MIME:
- DEBUG_INFO("XA_DATAFORMAT_MIME ");
- {
+ DEBUG_INFO("XA_DATAFORMAT_MIME ");
+ {
XADataFormat_MIME* mime = ((XADataFormat_MIME*)ctx->xaSink->pFormat);
DEBUG_INFO_A1("mime->containerType:%u",(int)mime->containerType);
- DEBUG_INFO_A1("mime->mimeType:%s",mime->mimeType);
+ DEBUG_INFO_A1_STR("mime->mimeType:%s", (char *)mime->mimeType);
switch ( mime->containerType )
- {
- case XA_CONTAINERTYPE_AVI:
- DEBUG_INFO("XA_CONTAINERTYPE_AVI");
- mux = gst_element_factory_make("avimux", "mux");
- if(mux)
{
- if (gst_bin_add(GST_BIN(codecbin), mux))
- {
- DEBUG_INFO("Added mux to codecbin");
- }
- else
+ case XA_CONTAINERTYPE_WAV:
{
- DEBUG_ERR("Could not add mux to codecbin");
- return NULL;
- }
- /*use this as linkpoint*/
- ghostsrc = gst_element_get_static_pad(mux,"src");
- }
- /* Add and link audio/video codecs */
- /*set video defaults*/
- if(ctx->videoEncSettings.encoderId == XA_ADAPTID_UNINITED)
- ctx->videoEncSettings.encoderId = XA_ADAPTID_MOTIONJPEG;
- if(ctx->xaVideoSource)
- {
- if(XACapabilitiesMgr_GetCapsById(NULL, (XACapsType)(XACAP_ENCODER|XACAP_VIDEO), ctx->videoEncSettings.encoderId, &temp) == XA_RESULT_SUCCESS)
- {
- if(temp.adaptId)
- {
- videoenc = gst_element_factory_make((char*)temp.adaptId, "videoenc");
- }
- }
- if(videoenc)
- {
- gst_bin_add(GST_BIN(codecbin), videoenc);
- if(!gst_element_link(videoenc, mux))
+ DEBUG_INFO("XA_CONTAINERTYPE_WAV");
+ audioenc = gst_element_factory_make("wavenc", "audioenc");
+ if(audioenc)
{
- DEBUG_ERR("Could not link videoenc to mux!!");
- DEBUG_API("<-XAMediaRecorderAdapt_CreateEncodeBin");
+ if (gst_bin_add(GST_BIN(codecbin), audioenc))
+ {
+ DEBUG_INFO("added audioenc to codecbin");
+ }
+ else
+ {
+ DEBUG_ERR("Could not add audioenc to codecbin");
return NULL;
+ }
+ /*use this as linkpoint*/
+ ghostsrc = gst_element_get_static_pad(audioenc,"src");
+ ghostaudiosink = gst_element_get_static_pad(audioenc,"sink");
+ if ( ghostsrc == NULL || ghostaudiosink == NULL)
+ {
+ DEBUG_ERR("Could not get src or sink ghoset element(s)");
+ return NULL;
+ }
}
- ghostvideosink = gst_element_get_static_pad(videoenc,"sink");
- }
- else
- {
- /*no video codec but video source = raw video case, request video pad directly from mux*/
- ghostvideosink = gst_element_get_request_pad(mux,"video_%d");
- }
- }
- /*set audio defaults*/
- if(ctx->audioEncSettings.encoderId == XA_ADAPTID_UNINITED)
- ctx->audioEncSettings.encoderId = XA_AUDIOCODEC_PCM;
- if(ctx->xaAudioSource)
- {
- if(XACapabilitiesMgr_GetCapsById(NULL, (XACapsType)(XACAP_ENCODER|XACAP_AUDIO), ctx->audioEncSettings.encoderId, &temp) == XA_RESULT_SUCCESS)
- {
- if(temp.adaptId)
- {
- audioenc = gst_element_factory_make((char*)temp.adaptId, "audioenc");
- }
- }
- if(audioenc)
- {
- gst_bin_add(GST_BIN(codecbin), audioenc);
- if(!gst_element_link(audioenc, mux))
- {
- DEBUG_ERR("Could not link audioenc to mux!!");
- DEBUG_API("<-XAMediaRecorderAdapt_CreateEncodeBin");
- return NULL;
- }
- ghostaudiosink = gst_element_get_static_pad(audioenc,"sink");
- }
- else
- {
- /*no audio codec but audio source = PCM case, explicity request audio pad*/
- ghostaudiosink = gst_element_get_request_pad(mux,"audio_%d");
+ /* no other codecs needed */
+ break;
}
- }
- break;
- case XA_CONTAINERTYPE_WAV:
- DEBUG_INFO("XA_CONTAINERTYPE_WAV");
- audioenc = gst_element_factory_make("wavenc", "audioenc");
- if(audioenc)
- {
- if (gst_bin_add(GST_BIN(codecbin), audioenc))
+ case XA_CONTAINERTYPE_UNSPECIFIED:
{
- DEBUG_INFO("added audioenc to codecbin");
- }
- else
- {
- DEBUG_ERR("Could not add audioenc to codecbin");
- return NULL;
- }
- /*use this as linkpoint*/
- ghostsrc = gst_element_get_static_pad(audioenc,"src");
- ghostaudiosink = gst_element_get_static_pad(audioenc,"sink");
- if ( ghostsrc == NULL || ghostaudiosink == NULL)
- {
- DEBUG_ERR("Could not get src or sink ghoset element(s)");
- return NULL;
+ DEBUG_INFO("No support for requested encoder...try to select encoder from mime string");
+ DEBUG_INFO("No support for requested mime/container type.");
+ ret = XA_RESULT_CONTENT_UNSUPPORTED;
+ break;
}
- }
- /* no other codecs needed */
- break;
- case XA_CONTAINERTYPE_JPG:
- /*motion jpeg*/
- DEBUG_INFO("XA_CONTAINERTYPE_JPG");
- /*set defaults*/
- if(ctx->videoEncSettings.encoderId == XA_ADAPTID_UNINITED)
- ctx->videoEncSettings.encoderId = XA_ADAPTID_MOTIONJPEG;
- if(XACapabilitiesMgr_GetCapsById(NULL, (XACapsType)(XACAP_ENCODER|XACAP_VIDEO), ctx->videoEncSettings.encoderId, &temp) == XA_RESULT_SUCCESS)
- {
- videoenc = gst_element_factory_make((char*)temp.adaptId, "videoenc");
- }
- if(videoenc)
- {
- gst_bin_add(GST_BIN(codecbin), videoenc);
- /*use this as linkpoint*/
- ghostsrc = gst_element_get_static_pad(videoenc,"src");
- ghostvideosink = gst_element_get_static_pad(videoenc,"sink");
- }
- /* no other codecs needed */
- break;
- case XA_CONTAINERTYPE_RAW:
- DEBUG_INFO("XA_CONTAINERTYPE_RAW");
- /* no need for codec, just pass data on */
- if(strncmp((char *)mime->mimeType, "video", 5) == 0 && ctx->xaVideoSource)
- {
- mux = gst_element_factory_make("identity", "mux");
- gst_bin_add(GST_BIN(codecbin), mux);
- ghostvideosink = gst_element_get_static_pad(mux,"sink");
- }
- else if (strncmp((char *)mime->mimeType, "audio", 5) == 0 && ctx->xaAudioSource)
- {
- mux = gst_element_factory_make("identity", "mux");
- gst_bin_add(GST_BIN(codecbin), mux);
- ghostaudiosink = gst_element_get_static_pad(mux,"sink");
- }
- else
- {
- ret = XA_RESULT_CONTENT_UNSUPPORTED;
- DEBUG_ERR("Content mismatch with given sources!!!")
- }
- ghostsrc = gst_element_get_static_pad(mux,"src");
- break;
- case XA_CONTAINERTYPE_UNSPECIFIED:
- DEBUG_INFO("No support for requested encoder...try to select encoder from mime string");
- if(strstr( (char *) mime->mimeType, "/ogg") != 0)
- {
- DEBUG_INFO("XA_CONTAINERTYPE_UNSPECIFIED - mimetype ogg detected");
- mux = gst_element_factory_make("oggmux", "mux");
+ case XA_CONTAINERTYPE_MP4:
+ {
+ DEBUG_INFO("XA_CONTAINERTYPE_MP4");
+ mux = gst_element_factory_make("mp4mux", "mp4mux");
if(mux)
- {
- gst_bin_add(GST_BIN(codecbin), mux);
+ {
+ if (gst_bin_add(GST_BIN(codecbin), mux))
+ {
+ DEBUG_INFO("Added mux to codecbin");
+ }
+ else
+ {
+ DEBUG_ERR("Could not add mux to codecbin");
+ return NULL;
+ }
/*use this as linkpoint*/
ghostsrc = gst_element_get_static_pad(mux,"src");
- /*set defaults*/
- if(ctx->audioEncSettings.encoderId == XA_ADAPTID_UNINITED)
- {
- ctx->audioEncSettings.encoderId = XA_ADAPTID_VORBIS;
- ctx->audioEncSettings.bitsPerSample=32;
}
- if(ctx->videoEncSettings.encoderId == XA_ADAPTID_UNINITED)
+ /* Add and link audio/video codecs */
+
+ /*set audio defaults*/
+ if(ctx->audioEncSettings.encoderId == XA_ADAPTID_UNINITED)
+ ctx->audioEncSettings.encoderId = XA_AUDIOCODEC_AAC;
+ if(ctx->xaAudioSource)
{
- ctx->videoEncSettings.encoderId = XA_ADAPTID_THEORA;
- }
- if(ctx->xaAudioSource)
- {
- if(XACapabilitiesMgr_GetCapsById(NULL, (XACapsType)(XACAP_ENCODER|XACAP_AUDIO), ctx->audioEncSettings.encoderId, &temp) == XA_RESULT_SUCCESS)
+ if(XACapabilitiesMgr_GetCapsById(ctx->baseObj.baseObj.capslist, (XACapsType)(XACAP_ENCODER|XACAP_AUDIO), ctx->audioEncSettings.encoderId, &temp) == XA_RESULT_SUCCESS)
{
- audioenc = gst_element_factory_make((char*)temp.adaptId, "audioenc");
- }
- if(audioenc)
- {
- gst_bin_add(GST_BIN(codecbin), audioenc);
- if(!gst_element_link(audioenc, mux))
+ if(temp.adaptId)
{
- DEBUG_ERR("Could not link audioenc to mux!!");
- DEBUG_API("<-XAMediaRecorderAdapt_CreateEncodeBin");
- return NULL;
+ audioenc = gst_element_factory_make((char*)temp.adaptId, "audioenc");
}
- ghostaudiosink = gst_element_get_static_pad(audioenc,"sink");
}
- }
- if(strncmp((char *)mime->mimeType, "video", 5) == 0 && ctx->xaVideoSource)
- {
- if(XACapabilitiesMgr_GetCapsById(NULL, (XACapsType)(XACAP_ENCODER|XACAP_VIDEO), ctx->videoEncSettings.encoderId, &temp) == XA_RESULT_SUCCESS)
+ if(audioenc)
{
- videoenc = gst_element_factory_make((char*)temp.adaptId, "videoenc");
+ gst_bin_add(GST_BIN(codecbin), audioenc);
+ if(!gst_element_link(audioenc, mux))
+ {
+ DEBUG_ERR("Could not link audioenc to mux!!");
+ DEBUG_API("<-XAMediaRecorderAdapt_CreateEncodeBin");
+ return NULL;
+ }
+ ghostaudiosink = gst_element_get_static_pad(audioenc,"sink");
}
- if(videoenc)
+ else
{
- gst_bin_add(GST_BIN(codecbin), videoenc);
- if(!gst_element_link(videoenc, mux))
- {
- DEBUG_ERR("Could not link videoenc to mux!!");
- DEBUG_API("<-XAMediaRecorderAdapt_CreateEncodeBin");
- return NULL;
- }
- ghostvideosink = gst_element_get_static_pad(videoenc,"sink");
+ /*no audio codec but audio source = PCM case, explicity request audio pad*/
+ ghostaudiosink = gst_element_get_request_pad(mux,"audio_%d");
}
}
- }
- }
- else
- {
- DEBUG_INFO("No support for requested mime/container type.");
- ret = XA_RESULT_CONTENT_UNSUPPORTED;
- }
- break;
- case XA_CONTAINERTYPE_MOBILE_DLS:
- case XA_CONTAINERTYPE_MP4:
- DEBUG_INFO("XA_CONTAINERTYPE_MP4");
- mux = gst_element_factory_make("mp4mux", "mp4mux");
- if(mux)
- {
- if (gst_bin_add(GST_BIN(codecbin), mux))
- {
- DEBUG_INFO("Added mux to codecbin");
- }
- else
- {
- DEBUG_ERR("Could not add mux to codecbin");
- return NULL;
- }
- /*use this as linkpoint*/
- ghostsrc = gst_element_get_static_pad(mux,"src");
- }
- /* Add and link audio/video codecs */
- /*set video defaults*/
- if(ctx->videoEncSettings.encoderId == XA_ADAPTID_UNINITED)
- ctx->videoEncSettings.encoderId = XA_ADAPTID_MOTIONJPEG;
- if(ctx->xaVideoSource)
- {
- if(XACapabilitiesMgr_GetCapsById(ctx->baseObj.baseObj.capslist, (XACapsType)(XACAP_ENCODER|XACAP_VIDEO), ctx->videoEncSettings.encoderId, &temp) == XA_RESULT_SUCCESS)
- {
- if(temp.adaptId)
- {
- videoenc = gst_element_factory_make((char*)temp.adaptId, "videoenc");
- }
- }
- if(videoenc)
+ break;
+ }
+ case XA_CONTAINERTYPE_AMR:
{
- gst_bin_add(GST_BIN(codecbin), videoenc);
- if(!gst_element_link(videoenc, mux))
- {
- DEBUG_ERR("Could not link videoenc to mux!!");
- DEBUG_API("<-XAMediaRecorderAdapt_CreateEncodeBin");
- return NULL;
- }
- ghostvideosink = gst_element_get_static_pad(videoenc,"sink");
- }
- else
- {
- /*no video codec but video source = raw video case, request video pad directly from mux*/
- ghostvideosink = gst_element_get_request_pad(mux,"video_%d");
- }
- }
- /*set audio defaults*/
- if(ctx->audioEncSettings.encoderId == XA_ADAPTID_UNINITED)
- ctx->audioEncSettings.encoderId = XA_AUDIOCODEC_AAC;
- if(ctx->xaAudioSource)
- {
- if(XACapabilitiesMgr_GetCapsById(ctx->baseObj.baseObj.capslist, (XACapsType)(XACAP_ENCODER|XACAP_AUDIO), ctx->audioEncSettings.encoderId, &temp) == XA_RESULT_SUCCESS)
- {
- if(temp.adaptId)
- {
- audioenc = gst_element_factory_make((char*)temp.adaptId, "audioenc");
- }
- }
- if(audioenc)
- {
-// GstCaps* caps = gst_caps_new_simple((const char*)mime->mimeType,
-// "mpegversion", G_TYPE_INT, 4,
-// "channels", G_TYPE_INT, 1,
-// "rate", G_TYPE_INT, 16000,
-// NULL);
- gst_bin_add(GST_BIN(codecbin), audioenc);
- //if(!gst_element_link_filtered(audioenc, mux,caps))
- if(!gst_element_link(audioenc, mux))
- {
- DEBUG_ERR("Could not link audioenc to mux!!");
- DEBUG_API("<-XAMediaRecorderAdapt_CreateEncodeBin");
- return NULL;
- }
- ghostaudiosink = gst_element_get_static_pad(audioenc,"sink");
- }
- else
- {
- /*no audio codec but audio source = PCM case, explicity request audio pad*/
- ghostaudiosink = gst_element_get_request_pad(mux,"audio_%d");
- }
- }
- break;
- case XA_CONTAINERTYPE_AMR:
DEBUG_INFO("XA_CONTAINERTYPE_AMR");
if(ctx->audioEncSettings.encoderId == XA_ADAPTID_UNINITED)
ctx->audioEncSettings.encoderId = XA_AUDIOCODEC_AMR;
mux = gst_element_factory_make("amrmux", "mux");
if(mux)
- {
+ {
if (gst_bin_add(GST_BIN(codecbin), mux))
- {
+ {
DEBUG_INFO("Added mux to codecbin");
- /*Setting the buffer size on src since amr generates
+ /*Setting the buffer size on src since amr generates
* small amounts of data */
g_object_set (G_OBJECT (ctx->audiosource),
"blocksize", 1280,
- NULL);
- }
+ NULL);
+ }
else
- {
+ {
DEBUG_ERR("Could not add mux to codecbin");
return NULL;
- }
+ }
/*use this as linkpoint*/
ghostsrc = gst_element_get_static_pad(mux,"src");
- }
+ }
/*set audio defaults*/
if(ctx->xaAudioSource)
- {
+ {
/*no audio codec but audio source = PCM case, explicity request audio pad*/
ghostaudiosink = gst_element_get_static_pad(mux,"sink");
- }
- break;
- case XA_CONTAINERTYPE_3GPP:
+ }
+ break;
+ }
+
+/* case XA_CONTAINERTYPE_3GPP:
+ case XA_CONTAINERTYPE_MOBILE_DLS:
case XA_CONTAINERTYPE_BMP:
case XA_CONTAINERTYPE_ASF:
case XA_CONTAINERTYPE_M4A:
@@ -1650,246 +985,63 @@
case XA_CONTAINERTYPE_AAC:
case XA_CONTAINERTYPE_3GA:
case XA_CONTAINERTYPE_RM:
- case XA_CONTAINERTYPE_DMF:
+ case XA_CONTAINERTYPE_DMF:*/
+
default:
- DEBUG_INFO("No support for requested container type.");
- ret = XA_RESULT_CONTENT_UNSUPPORTED;
- break;
+ DEBUG_INFO("No support for requested container type.");
+ ret = XA_RESULT_CONTENT_UNSUPPORTED;
+ break;
+ }
+ break;
}
- break;
+ default:
+ DEBUG_ERR("Incorrect data format type.");
+ ret = XA_RESULT_PARAMETER_INVALID;
+ break;
}
- default:
- DEBUG_ERR("Incorrect data format type.");
- ret = XA_RESULT_PARAMETER_INVALID;
- break;
+ }
+ else
+ {
+ DEBUG_ERR("Invalid data sink for stream recording!!");
+ ret = XA_RESULT_PARAMETER_INVALID;
}
}
- else
- {
- DEBUG_ERR("Invalid data sink for stream recording!!");
- ret = XA_RESULT_PARAMETER_INVALID;
- }
- }
else
- {/* stream recording not requested, datasink ignored, use uncoded recordstream*/
+ {/* stream recording not requested, datasink ignored, use uncoded recordstream*/
mux = gst_element_factory_make("identity", "mux");
gst_bin_add(GST_BIN(codecbin), mux);
ghostsrc = gst_element_get_static_pad(mux,"src");
- ghostvideosink = gst_element_get_static_pad(mux,"sink");
- }
+ }
/*set default codecs for unrecognized*/
if(ctx->audioEncSettings.encoderId == XA_ADAPTID_UNINITED)
ctx->audioEncSettings.encoderId = XA_AUDIOCODEC_PCM;
- if(ctx->imageEncSettings.encoderId == XA_ADAPTID_UNINITED)
- ctx->imageEncSettings.encoderId = XA_IMAGECODEC_RAW;
- if(ctx->videoEncSettings.encoderId == XA_ADAPTID_UNINITED)
- ctx->videoEncSettings.encoderId = XA_ADAPTID_RAWVIDEO;
if ( ret != XA_RESULT_SUCCESS )
- {
+ {
gst_object_unref(codecbin);
codecbin=NULL;
- }
+ }
else
- {
+ {
/*add ghost pad(s) to link to*/
if(ghostsrc)
- {
+ {
gst_element_add_pad(codecbin, gst_ghost_pad_new("src",ghostsrc));
gst_object_unref(GST_OBJECT(ghostsrc));
- }
+ }
if(ghostaudiosink)
- {
+ {
gst_element_add_pad(codecbin, gst_ghost_pad_new("sink",ghostaudiosink));
gst_object_unref(GST_OBJECT(ghostaudiosink));
+ }
+
+ DEBUG_INFO_A1("Created encoder bin at %x", (int)codecbin);
}
- if(ghostvideosink)
- {
- gst_element_add_pad(codecbin, gst_ghost_pad_new("v_sink",ghostvideosink));
- gst_object_unref(GST_OBJECT(ghostvideosink));
- }
- DEBUG_INFO_A1("Created encoder bin at %x", (int)codecbin);
- }
DEBUG_API("<-XAMediaRecorderAdapt_CreateEncodeBin");
return codecbin;
-}
-
-/*
- * void XAMediaRecorderAdapt_BufferAvailable(GstElement* sink, gpointer user_data)
- * called when new buffer is available at appsink
- */
-void XAMediaRecorderAdapt_BufferAvailable(GstElement* sink, gpointer user_data)
-{
- GstBuffer *buffer=NULL;
- XAMediaRecorderAdaptationCtx* mCtx = (XAMediaRecorderAdaptationCtx*)user_data;
- DEBUG_API("->XAMediaRecorderAdapt_BufferAvailable");
- if(!mCtx || !mCtx->xaSink)
- {
- DEBUG_ERR("Invalid context")
- return;
- }
- /* get the buffer */
- buffer = gst_app_sink_pull_buffer(GST_APP_SINK(sink));
- if(buffer)
- {
- guint size;
- XADataLocator_Address* address;
- size = GST_BUFFER_SIZE(buffer);
- DEBUG_INFO_A1("Pulled new buffer of size %d", size);
- address = (XADataLocator_Address*)(mCtx->xaSink->pLocator);
- if( !address || *(XAuint32*)address != XA_DATALOCATOR_ADDRESS )
- {
- DEBUG_ERR("Invalid address datalocator")
- return;
- }
-
- if(mCtx->writepos + size < address->length )
- { /*enough room in buffer*/
- memcpy(((char*)(address->pAddress) + mCtx->writepos),
- GST_BUFFER_DATA (buffer), size);
- mCtx->writepos+=size;
- }
- else
- { /*not enough room in buffer*/
- XAAdaptEvent event =
- {XA_RECORDITFEVENTS, XA_RECORDEVENT_BUFFER_FULL, 0, NULL};
-
- size = address->length - mCtx->writepos;
- memcpy(((char*)(address->pAddress) + mCtx->writepos),
- GST_BUFFER_DATA (buffer), size);
- DEBUG_INFO_A1("Buffer insufficient, wrote %d bytes", size);
- /* send event */
- XAAdaptationBase_SendAdaptEvents(&(mCtx->baseObj.baseObj), &event);
- /* "recordhead to start" i.e. reset write position */
- mCtx->writepos=0;
- mCtx->recThrCtx.buffer_insufficient = XA_BOOLEAN_TRUE;
- if ( XAImpl_PostSemaphore( mCtx->recThrCtx.bufInsufficientSem ) != XA_RESULT_SUCCESS)
- {
- DEBUG_ERR("Posting buffer-insufficien semaphore FAILED!");
- }
- }
- gst_buffer_unref (buffer);
- }
- else
- {
- DEBUG_ERR("Could not pull buffer from appsink!");
- }
- DEBUG_API("<-XAMediaRecorderAdapt_BufferAvailable");
-}
-
-/*
- * void* XAMediaRecorderAdapt_RecordEventThr( void* ctx )
- */
-void* XAMediaRecorderAdapt_RecordEventThr( void* ctx )
-{
- XAMediaRecorderAdaptationCtx* mrCtx = (XAMediaRecorderAdaptationCtx*)ctx;
- GstStateChangeReturn gret;
- XAresult ret;
- DEBUG_API("->XAMediaRecorderAdapt_RecordEventThr");
-
- /* Wait semaphore here */
- ret = XAImpl_WaitSemaphore( mrCtx->recThrCtx.bufInsufficientSem );
- if ( ret != XA_RESULT_SUCCESS)
- {
- DEBUG_ERR("Could not start semaphore");
- }
-
- if(mrCtx->recThrCtx.buffer_insufficient)
- {
- mrCtx->baseObj.binWantedState = GST_STATE_PAUSED;
- XAAdaptationGst_PrepareAsyncWait(&(mrCtx->baseObj));
- gret = gst_element_set_state( GST_ELEMENT(mrCtx->baseObj.bin), mrCtx->baseObj.binWantedState);
- if( gret == GST_STATE_CHANGE_ASYNC )
- {
- DEBUG_INFO("Start to wait recoder state change.");
- XAAdaptationGst_StartAsyncWait(&(mrCtx->baseObj));
- DEBUG_INFO("Recorder state change async. SUCCESFULL.");
- }
- else if( gret == GST_STATE_CHANGE_FAILURE )
- {
- DEBUG_INFO("Recorder state change FAILED");
- /*ret = XA_RESULT_INTERNAL_ERROR;*/
- }
- else
- {
- DEBUG_INFO("Recorder state change SUCCESFULL")
- }
-
- mrCtx->baseObj.waitingasyncop= XA_BOOLEAN_FALSE;
- }
- DEBUG_API("<-XAMediaRecorderAdapt_RecordEventThr");
- return NULL;
-}
-
-/*XAresult XAMediaRecorderAdapt_CreateCapsFilter( XAMediaRecorderAdaptationCtx* ctx )
-{
-
- GstCaps* encSrcCaps = NULL;
- XADataFormat_MIME *pMime = 0;
-
- if (!ctx )
- return XA_RESULT_PARAMETER_INVALID;
-
- DEBUG_INFO("create capsfilter");
- ctx->audiofilter = gst_element_factory_make("capsfilter", "audiofilter");
- if( !ctx->audiofilter )
- {
- return XA_RESULT_INTERNAL_ERROR;
- }
- // GstCaps* encSrcCaps; TL
- if (gst_bin_add(GST_BIN(ctx->baseObj.bin), ctx->audiofilter))
- {
- DEBUG_INFO("Added audiofilter to bin");
- }
- else
- {
- DEBUG_ERR("Could not add audio filter to bin");
- return XA_RESULT_INTERNAL_ERROR;
- }
-
- pMime = (XADataFormat_MIME*) ctx->xaSink->pFormat;
- if(!strcmp((const char*)pMime->mimeType, "audio/amr"))
- {
- encSrcCaps = gst_caps_new_simple ("audio/amr",
- "width", G_TYPE_INT, ctx->audioEncSettings.bitsPerSample,
- "depth", G_TYPE_INT, ctx->audioEncSettings.bitsPerSample,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, ctx->audioEncSettings.sampleRate,
- "channels", G_TYPE_INT, ctx->audioEncSettings.channelsOut, NULL);
- }
- else
- {
- encSrcCaps = gst_caps_new_full(
- gst_structure_new("audio/x-raw-int",
- "channels", G_TYPE_INT, ctx->audioEncSettings.channelsOut,
- "width", G_TYPE_INT, ctx->audioEncSettings.bitsPerSample,
- "width", G_TYPE_INT, ctx->audioEncSettings.bitsPerSample,
- "rate", G_TYPE_INT, ctx->audioEncSettings.sampleRate,
- "bitrate", G_TYPE_INT, ctx->audioEncSettings.bitRate,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- NULL),
- gst_structure_new("audio/x-raw-float",
- "channels", G_TYPE_INT, ctx->audioEncSettings.channelsOut,
- "width", G_TYPE_INT, ctx->audioEncSettings.bitsPerSample,
- "rate", G_TYPE_INT, ctx->audioEncSettings.sampleRate,
- "bitrate", G_TYPE_INT, ctx->audioEncSettings.bitRate,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- NULL),
- NULL);
-
}
- DEBUG_INFO_A1("audio encoder config from settings: %s",gst_caps_to_string(encSrcCaps));
- g_object_set( G_OBJECT(ctx->audiofilter), "caps",encSrcCaps,NULL);
-
- gst_caps_unref(encSrcCaps);
- return XA_RESULT_SUCCESS;
-}*/
-