summaryrefslogtreecommitdiff
path: root/indra/media_plugins
diff options
context:
space:
mode:
Diffstat (limited to 'indra/media_plugins')
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h6
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp21
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h2
-rw-r--r--indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp78
4 files changed, 62 insertions, 45 deletions
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
index 2244ccc146..799808aa8b 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
@@ -37,10 +37,16 @@
#include <cstdio>
+extern "C" {
+#include <sys/types.h>
+#include <unistd.h>
+}
+
/////////////////////////////////////////////////////////////////////////
// Debug/Info/Warning macros.
#define MSGMODULEFOO "(media plugin)"
#define STDERRMSG(...) do{\
+ fprintf(stderr, " pid:%d: ", (int)getpid());\
fprintf(stderr, MSGMODULEFOO " %s:%d: ", __FUNCTION__, __LINE__);\
fprintf(stderr, __VA_ARGS__);\
fputc('\n',stderr);\
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
index 5bb0ef5a99..484948bd9f 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
@@ -108,11 +108,10 @@ gst_slvideo_show_frame (GstBaseSink * bsink, GstBuffer * buf)
slvideo = GST_SLVIDEO(bsink);
-#if 0
- fprintf(stderr, "\n\ntransferring a frame of %dx%d <- %p (%d)\n\n",
- slvideo->width, slvideo->height, GST_BUFFER_DATA(buf),
- slvideo->format);
-#endif
+ DEBUGMSG("transferring a frame of %dx%d <- %p (%d)",
+ slvideo->width, slvideo->height, GST_BUFFER_DATA(buf),
+ slvideo->format);
+
if (GST_BUFFER_DATA(buf))
{
// copy frame and frame info into neutral territory
@@ -337,7 +336,7 @@ gst_slvideo_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
#define MAXDEPTHHACK 4
GST_OBJECT_LOCK(slvideo);
- if (slvideo->resize_forced)
+ if (slvideo->resize_forced_always) // app is giving us a fixed size to work with
{
gint slwantwidth, slwantheight;
slwantwidth = slvideo->resize_try_width;
@@ -386,6 +385,8 @@ gst_slvideo_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
}
}
+ GST_OBJECT_UNLOCK(slvideo);
+
if (!made_bufferdata_ptr) // need to fallback to malloc at original size
{
GST_BUFFER_SIZE(newbuf) = width * height * MAXDEPTHHACK;
@@ -394,8 +395,6 @@ gst_slvideo_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
llgst_buffer_set_caps (GST_BUFFER_CAST(newbuf), caps);
}
- GST_OBJECT_UNLOCK(slvideo);
-
*buf = GST_BUFFER_CAST(newbuf);
return GST_FLOW_OK;
@@ -459,7 +458,7 @@ gst_slvideo_init (GstSLVideo * filter,
filter->retained_frame_format = SLV_PF_UNKNOWN;
GstCaps *caps = llgst_caps_from_string (SLV_ALLCAPS);
llgst_caps_replace (&filter->caps, caps);
- filter->resize_forced = false;
+ filter->resize_forced_always = false;
filter->resize_try_width = -1;
filter->resize_try_height = -1;
GST_OBJECT_UNLOCK(filter);
@@ -500,7 +499,7 @@ gst_slvideo_get_property (GObject * object, guint prop_id,
static gboolean
plugin_init (GstPlugin * plugin)
{
- DEBUGMSG("\n\n\nPLUGIN INIT\n\n\n");
+ DEBUGMSG("PLUGIN INIT");
GST_DEBUG_CATEGORY_INIT (gst_slvideo_debug, (gchar*)"private-slvideo-plugin",
0, (gchar*)"Second Life Video Sink");
@@ -528,7 +527,7 @@ void gst_slvideo_init_class (void)
"http://www.secondlife.com/");
#undef PACKAGE
ll_gst_plugin_register_static (&gst_plugin_desc);
- DEBUGMSG(stderr, "\n\n\nCLASS INIT\n\n\n");
+ DEBUGMSG("CLASS INIT");
}
#endif // LL_GSTREAMER010_ENABLED
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
index 208523e8d0..8f1cf84978 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
@@ -90,7 +90,7 @@ struct _GstSLVideo
int retained_frame_width, retained_frame_height;
SLVPixelFormat retained_frame_format;
// sticky resize info
- bool resize_forced;
+ bool resize_forced_always;
int resize_try_width;
int resize_try_height;
};
diff --git a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
index d21ff26f83..26173314a7 100644
--- a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
+++ b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
@@ -105,7 +105,7 @@ private:
void mouseUp( int x, int y );
void mouseMove( int x, int y );
- bool sizeChanged();
+ void sizeChanged();
static bool mDoneInit;
@@ -115,13 +115,16 @@ private:
int mDepth;
- // media natural size
+ // media NATURAL size
int mNaturalWidth;
int mNaturalHeight;
- int mNaturalRowbytes;
- // previous media natural size so we can detect changes
- int mPreviousNaturalWidth;
- int mPreviousNaturalHeight;
+ // media current size
+ int mCurrentWidth;
+ int mCurrentHeight;
+ int mCurrentRowbytes;
+ // previous media size so we can detect changes
+ int mPreviousWidth;
+ int mPreviousHeight;
// desired render size from host
int mWidth;
int mHeight;
@@ -149,7 +152,7 @@ MediaPluginGStreamer010::MediaPluginGStreamer010(
void *host_user_data ) :
MediaPluginBase(host_send_func, host_user_data),
mBusWatchID ( 0 ),
- mNaturalRowbytes ( 4 ),
+ mCurrentRowbytes ( 4 ),
mTextureFormatPrimary ( GL_RGBA ),
mTextureFormatType ( GL_UNSIGNED_INT_8_8_8_8_REV ),
mSeekWanted(false),
@@ -195,6 +198,7 @@ MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
}
else
{
+ // TODO: grok 'duration' message type
DEBUGMSG("Got GST message type: %s",
LLGST_MESSAGE_TYPE_NAME (message));
}
@@ -429,8 +433,8 @@ MediaPluginGStreamer010::update(int milliseconds)
{
DEBUGMSG("NEW FRAME READY");
- if (mVideoSink->retained_frame_width != mNaturalWidth ||
- mVideoSink->retained_frame_height != mNaturalHeight)
+ if (mVideoSink->retained_frame_width != mCurrentWidth ||
+ mVideoSink->retained_frame_height != mCurrentHeight)
// *TODO: also check for change in format
{
// just resize container, don't consume frame
@@ -457,39 +461,38 @@ MediaPluginGStreamer010::update(int milliseconds)
GST_OBJECT_UNLOCK(mVideoSink);
- mNaturalRowbytes = neww * newd;
+ mCurrentRowbytes = neww * newd;
DEBUGMSG("video container resized to %dx%d",
neww, newh);
mDepth = newd;
- mNaturalWidth = neww;
- mNaturalHeight = newh;
+ mCurrentWidth = neww;
+ mCurrentHeight = newh;
sizeChanged();
return true;
}
if (mPixels &&
- mNaturalHeight <= mHeight &&
- mNaturalWidth <= mWidth &&
+ mCurrentHeight <= mHeight &&
+ mCurrentWidth <= mWidth &&
!mTextureSegmentName.empty())
{
-
// we're gonna totally consume this frame - reset 'ready' flag
- mVideoSink->retained_frame_ready = FALSE;
+ mVideoSink->retained_frame_ready = FALSE;
int destination_rowbytes = mWidth * mDepth;
- for (int row=0; row<mNaturalHeight; ++row)
+ for (int row=0; row<mCurrentHeight; ++row)
{
memcpy(&mPixels
[destination_rowbytes * row],
&mVideoSink->retained_frame_data
- [mNaturalRowbytes * row],
- mNaturalRowbytes);
+ [mCurrentRowbytes * row],
+ mCurrentRowbytes);
}
GST_OBJECT_UNLOCK(mVideoSink);
DEBUGMSG("NEW FRAME REALLY TRULY CONSUMED, TELLING HOST");
- setDirty(0,0,mNaturalWidth,mNaturalHeight);
+ setDirty(0,0,mCurrentWidth,mCurrentHeight);
}
else
{
@@ -836,27 +839,35 @@ MediaPluginGStreamer010::startup()
}
-bool
+void
MediaPluginGStreamer010::sizeChanged()
{
// the shared writing space has possibly changed size/location/whatever
- // Check to see whether the movie's natural size has updated
- if (mNaturalWidth != mPreviousNaturalWidth ||
- mNaturalHeight != mPreviousNaturalHeight)
+ // Check to see whether the movie's NATURAL size has been set yet
+ if (1 == mNaturalWidth &&
+ 1 == mNaturalHeight)
{
- mPreviousNaturalWidth = mNaturalWidth;
- mPreviousNaturalHeight = mNaturalHeight;
+ mNaturalWidth = mCurrentWidth;
+ mNaturalHeight = mCurrentHeight;
+ DEBUGMSG("Media NATURAL size better detected as %dx%d",
+ mNaturalWidth, mNaturalHeight);
+ }
+
+ // if the size has changed then the shm has changed and the app needs telling
+ if (mCurrentWidth != mPreviousWidth ||
+ mCurrentHeight != mPreviousHeight)
+ {
+ mPreviousWidth = mCurrentWidth;
+ mPreviousHeight = mCurrentHeight;
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_request");
message.setValue("name", mTextureSegmentName);
message.setValueS32("width", mNaturalWidth);
message.setValueS32("height", mNaturalHeight);
- DEBUGMSG("<--- Sending size change request to application with name: '%s' - size is %d x %d", mTextureSegmentName.c_str(), mNaturalWidth, mNaturalHeight);
+ DEBUGMSG("<--- Sending size change request to application with name: '%s' - natural size is %d x %d", mTextureSegmentName.c_str(), mNaturalWidth, mNaturalHeight);
sendMessage(message);
}
-
- return true;
}
@@ -941,10 +952,12 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
// lame to have to decide this now, it depends on the movie. Oh well.
mDepth = 4;
+ mCurrentWidth = 1;
+ mCurrentHeight = 1;
+ mPreviousWidth = 1;
+ mPreviousHeight = 1;
mNaturalWidth = 1;
mNaturalHeight = 1;
- mPreviousNaturalWidth = 1;
- mPreviousNaturalHeight = 1;
mWidth = 1;
mHeight = 1;
mTextureWidth = 1;
@@ -985,7 +998,6 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
INFOMSG("MediaPluginGStreamer010::receiveMessage: shared memory added, name: %s, size: %d, address: %p", name.c_str(), int(info.mSize), info.mAddress);
mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
-
}
else if(message_name == "shm_remove")
{
@@ -1064,7 +1076,7 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
INFOMSG("**** = REAL RESIZE REQUEST FROM APP");
GST_OBJECT_LOCK(mVideoSink);
- mVideoSink->resize_forced = true;
+ mVideoSink->resize_forced_always = true;
mVideoSink->resize_try_width = texture_width;
mVideoSink->resize_try_height = texture_height;
GST_OBJECT_UNLOCK(mVideoSink);