<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body bgcolor="#FFFFFF" text="#000000">
Hello!<br>
<br>
Apologies for the double post, but my inept handling of Thunderbird
caused my last post to be appended to an unrelated thread. Sorry
about that Luis dArquer.<br>
<br>
For the sake of posterity, here's is the original question:<br>
<br>
I feel like I am so close to finally getting through to the other
side with this problem, so I'm hoping someone can give me a few
clues as to what pieces of the puzzle are missing. I used to use
gStreamer as a pure 'decoding' library using this simple pipeline:
<br>
<br>
uridecodebin uri=" + mPathToVideoFile + " ! videoconvert !
appsink name=sink
caps="video/x-raw,format=RGB,pixel-aspect-ratio=1/1";
<br>
<br>
With this pipeline, I could quite easily grab the frames arriving at
the sink and use them however I pleased. Mostly just throwing them
on a texture in OpenGL and displaying them various places. This
approach is - of course - quite horrible. I'm not making use of
gstreamer as a fully-fledged media pipeline. So to rectify that -
and because I'd like to run some simple shaders on the video data -
I am now using this (almost as) simple pipeline:
<br>
<br>
uridecodebin uri=" + mPathToVideoFile + " ! glshader name=shader
location=" + pathToShader + " vars=\"float silver = float( 0.8 ); \"
! appsink name=sink
caps=\"video/x-raw,format=RGB,pixel-aspect-ratio=1/1\"";
<br>
<br>
I make sure to share my current OpenGL context with the glshader
element thusly:
<br>
<br>
mPipeline_ShaderPre = gst_bin_get_by_name( GST_BIN( mGstPipeline ),
"shader" );
<br>
HGLRC mainContext = ::wglGetCurrentContext();
<br>
g_object_set( mPipeline_ShaderPre, "other-context", mainContext,
NULL );
<br>
<br>
Not sure if this is correct to be honest, but I didn't see any
errors in gstreamers logs. Anyway - fast forward to my callback
function that fires whenever a sample is ready at the sink I proceed
to grab a Sample, from which I grab a Buffer, from which I grab a
Frame, from which I grab a Texture ID, thusly:
<br>
<br>
GstSample* gstVideoSinkSample = gst_app_sink_pull_sample(
GST_APP_SINK( appsink ) );
<br>
GstBuffer* gstBuffer = gst_sample_get_buffer( gstVideoSinkSample );
<br>
if ( !gst_video_frame_map( &gstFrame, &gstInfo, gstBuffer,
static_cast<GstMapFlags>( GST_MAP_READ | ( GST_MAP_FLAG_LAST
<< 1 ) ) ) )
<br>
{
<br>
errorToConsole( true, "Failed to map video frame" );
<br>
}
<br>
GLuint textureId = *(guint *) gstFrame.data[0];
<br>
<br>
The result is the number 6. Which I felt was a plausible Texture ID
handle. But when I then use a lovely tool named imdebug, and presume
that the target for the texture is GL_TEXTURE_2D (which might be
wrong), it throws a fit, because it attempts to determine the width
and height of said texture via these calls:
<br>
<br>
glBindTexture(target, texture);
<br>
glGetTexLevelParameteriv(target, 0, GL_TEXTURE_WIDTH, &w);
<br>
glGetTexLevelParameteriv(target, 0, GL_TEXTURE_HEIGHT, &h);
<br>
<br>
So clearly something is wrong. Some place along this winding road,
I've misunderstood something or overlooked something. I'd much
appreciate any suggestions/clues!
<br>
<br>
I myself am wondering if a callback at the sink is the right place
to grab the texture ID, but I'm not sure how to get at it any
earlier, and if that's wise. I am also unsure of how long this
texture Id is valid if I want to render it on to a quad. I hope
someone can shed a bit of light!
<br>
<br>
Regards,
<br>
Lasse
<br>
<br>
<div class="moz-signature">-- <br>
Lasse Farnung Laursen<br>
Researcher at the University of Tokyo<br>
<a href="http://www.lasselaursen.com">www.lasselaursen.com</a><br>
Twitter: <a href="https://twitter.com/PMP_J">@PMP_J</a></div>
</body>
</html>