diff options
author | Reynaldo H. Verdejo Pinochet <reynaldo.verdejo@collabora.co.uk> | 2011-04-05 17:49:24 -0400 |
---|---|---|
committer | Reynaldo H. Verdejo Pinochet <reynaldo.verdejo@collabora.co.uk> | 2011-04-06 18:58:18 -0400 |
commit | e83a6c3998d7cce0d12903f2b972c554acde910a (patch) | |
tree | 0c470b46c30cd0cd1e0843cddbee7b61e69696af /gstplayer | |
parent | b888bf6c49b9244deb792d1fe968a09632f7e549 (diff) |
Make GstMetadataRetriever not to bork
Diffstat (limited to 'gstplayer')
-rw-r--r-- | gstplayer/GstMetadataRetriever.cpp | 10 | ||||
-rw-r--r-- | gstplayer/GstMetadataRetrieverDriver.cpp | 74 | ||||
-rw-r--r-- | gstplayer/GstMetadataRetrieverDriver.h | 9 |
3 files changed, 83 insertions, 10 deletions
diff --git a/gstplayer/GstMetadataRetriever.cpp b/gstplayer/GstMetadataRetriever.cpp index 4cc8636..78b6f8f 100644 --- a/gstplayer/GstMetadataRetriever.cpp +++ b/gstplayer/GstMetadataRetriever.cpp @@ -86,7 +86,7 @@ status_t GstMetadataRetriever::setDataSource(int fd, int64_t offset, int64_t len mGstDriver->prepareSync(); status = mGstDriver->getStatus(); - LOGV("GstMetadataRetriever setDataSource %s", (status == GST_STATE_PAUSED)? "OK": "not correct state"); + LOGV("GstMetadataRetriever setDataSource %s:%d", (status == GST_STATE_PAUSED)? "OK": "not correct state", status); if(status != GST_STATE_PAUSED) return UNKNOWN_ERROR; @@ -108,6 +108,7 @@ status_t GstMetadataRetriever::setMode(int mode) if (!mLocked) { LOGV("GstMetadataRetriever setMode activate video protection"); g_static_mutex_lock (&GstMetadataRetriever_mutex); + LOGV("Lock on GstMetadataRetriever acquired"); mLocked = 1 ; } else { LOGV("GstMetadataRetriever::setMode video protection already activated"); @@ -186,6 +187,7 @@ MediaAlbumArt* GstMetadataRetriever::extractAlbumArt() mGstDriver->getAlbumArt(&data, &size); + LOGV("From extract AlbumArt: Data:%d Size:%d\n", data, size); if(data && size) { MediaAlbumArt* albumArt = new MediaAlbumArt(); albumArt->mSize = size; @@ -194,6 +196,12 @@ MediaAlbumArt* GstMetadataRetriever::extractAlbumArt() return albumArt; // must free by caller } + if (mLocked) { + LOGV("No AlbumArt data, releasing video protection lock"); + g_static_mutex_unlock(&GstMetadataRetriever_mutex); + mLocked = 0; + } + return NULL; } diff --git a/gstplayer/GstMetadataRetrieverDriver.cpp b/gstplayer/GstMetadataRetrieverDriver.cpp index 86dc175..8d79b32 100644 --- a/gstplayer/GstMetadataRetrieverDriver.cpp +++ b/gstplayer/GstMetadataRetrieverDriver.cpp @@ -42,6 +42,10 @@ static GstStaticCaps static_have_video_caps = GST_STATIC_CAPS ("video/x-raw-yuv; GstMetadataRetrieverDriver::GstMetadataRetrieverDriver(): mPipeline(NULL), mAppsrc(NULL), + mColorTransform(NULL), + mPlayBin(NULL), + mAppSink(NULL), + mAudioSink(NULL), mUri(NULL), mTag_list(NULL), mFdSrcOffset_min(0), mFdSrcOffset_max(0), @@ -87,6 +91,38 @@ GstMetadataRetrieverDriver::~GstMetadataRetrieverDriver() } } +void +GstMetadataRetrieverDriver::cb_newpad(GstElement *mPlayBin, GstPad *pad, + GstMetadataRetrieverDriver *data) +{ + GstCaps *caps; + GstStructure *str; + gboolean err = true; + + caps = gst_pad_get_caps (pad); + str = gst_caps_get_structure (caps, 0); + if (g_strrstr (gst_structure_get_name (str), "audio")) { + LOGI ("cb_newpad Called for an audio pad"); + data->mAudioSink = gst_element_factory_make ("fakesink", NULL); + gst_bin_add (GST_BIN (data->mPipeline), data->mAudioSink); + gst_element_set_state (data->mAudioSink, GST_STATE_PAUSED); + err = gst_element_link (data->mPlayBin, data->mAudioSink); + } + else + if (g_strrstr (gst_structure_get_name (str), "video")) { + LOGI ("cb_newpad Called for a video pad"); + err = gst_element_link (data->mPlayBin, data->mColorTransform); + } + + if (!err) + LOGE ("Could not link %s with %s", GST_ELEMENT_NAME (data->mPlayBin), + GST_ELEMENT_NAME (data->mAudioSink? + data->mAudioSink : data->mColorTransform)); + + gst_caps_unref (caps); + + return; +} void GstMetadataRetrieverDriver::setup(int mode) { @@ -95,19 +131,40 @@ void GstMetadataRetrieverDriver::setup(int mode) mMode = mode; if(mMode & METADATA_MODE_FRAME_CAPTURE_ONLY) { - description = g_strdup_printf("uridecodebin uri=%s name=src ! icbtransform ! appsink name=sink caps=\"video/x-raw-rgb,bpp=16\" enable-last-buffer=true", mUri); + LOGI("Called in METADATA_MODE_FRAME_CAPTURE_ONLY mode"); + + mPipeline = gst_pipeline_new ("pipeline"); + mColorTransform = gst_element_factory_make ("ffmpegcolorspace", NULL); + mPlayBin = gst_element_factory_make ("uridecodebin", "src"); + mAppSink = gst_element_factory_make("appsink", "sink"); + + g_object_set (G_OBJECT (mPlayBin), "uri", mUri, NULL); + g_object_set (G_OBJECT (mAppSink), "enable-last-buffer", "true", NULL); + g_signal_connect (mPlayBin, "pad-added", G_CALLBACK (cb_newpad), + this); + + gst_bin_add_many (GST_BIN (mPipeline), mPlayBin, mColorTransform, + mAppSink, NULL); + + if (!gst_element_link (mColorTransform, mAppSink)) + LOGE("Failed to link %s to %s", + GST_ELEMENT_NAME (mColorTransform), + GST_ELEMENT_NAME (mAppSink)); + + gst_element_set_state (mPlayBin, GST_STATE_PAUSED); + gst_element_set_state (mAppSink, GST_STATE_PAUSED); + gst_element_set_state (mColorTransform, GST_STATE_PAUSED); + } else { description = g_strdup_printf("uridecodebin uri=%s name=src ! fakesink name=sink", mUri); + mPipeline = gst_parse_launch(description, &error); } - LOGV("create pipeline"); - mPipeline = gst_parse_launch(description, &error); - if(!mPipeline) { LOGE("can't create pipeline"); return; } - LOGV("pipeline creation: %s", gst_element_get_name(mPipeline)); + LOGV("pipeline creation: %s", GST_ELEMENT_NAME (mPipeline)); // verbose info (as gst-launch -v) // Activate the trace with the command: "setprop persist.gst.verbose 1" @@ -119,7 +176,8 @@ void GstMetadataRetrieverDriver::setup(int mode) g_signal_connect (mPipeline, "deep_notify", G_CALLBACK (gst_object_default_deep_notify), NULL); } - + + //gst_element_set_state (mPipeline, GST_STATE_NULL); mState = GST_STATE_NULL; } @@ -366,13 +424,11 @@ void GstMetadataRetrieverDriver::prepareSync() } bus = gst_pipeline_get_bus (GST_PIPELINE(mPipeline)); - gst_element_set_state(mPipeline, GST_STATE_READY); - gst_element_set_state(mPipeline, GST_STATE_PAUSED); message = gst_bus_timed_pop_filtered(bus, PREPARE_SYNC_TIMEOUT, message_filter); -// mState = GST_STATE_PAUSED; + mState = GST_STATE_PAUSED; while(message != NULL) { switch(GST_MESSAGE_TYPE(message)) { diff --git a/gstplayer/GstMetadataRetrieverDriver.h b/gstplayer/GstMetadataRetrieverDriver.h index 1048b76..181cc3a 100644 --- a/gstplayer/GstMetadataRetrieverDriver.h +++ b/gstplayer/GstMetadataRetrieverDriver.h @@ -50,9 +50,18 @@ public: void getAlbumArt(guint8 **data, guint64 *size); void getFrameRate(int* framerate); + static + void cb_newpad(GstElement *mPlayBin, GstPad *pad, + GstMetadataRetrieverDriver *data); + private: GstElement* mPipeline; GstElement* mAppsrc; + GstElement* mColorTransform; + GstElement* mPlayBin; + GstElement* mAppSink; + GstElement* mAudioSink; + gchar* mUri; static GstBusSyncReply bus_message(GstBus *bus, GstMessage * msg, gpointer data); |