diff -r 4ce423f34688 -r e267340986c9 khronosfws/openmax_al/src/gst_adaptation/xamediarecorderadaptctx.c --- 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 -#include #include -#include #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)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; -}*/ -