OpenGL Texture via GstGLUpload - So close! - Proper Post
Lasse Laursen
lasse at lasselaursen.com
Thu Jan 15 08:14:37 PST 2015
Hello!
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.
For the sake of posterity, here's is the original question:
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:
uridecodebin uri=" + mPathToVideoFile + " ! videoconvert ! appsink
name=sink caps="video/x-raw,format=RGB,pixel-aspect-ratio=1/1";
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:
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\"";
I make sure to share my current OpenGL context with the glshader element
thusly:
mPipeline_ShaderPre = gst_bin_get_by_name( GST_BIN( mGstPipeline ),
"shader" );
HGLRC mainContext = ::wglGetCurrentContext();
g_object_set( mPipeline_ShaderPre, "other-context", mainContext, NULL );
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:
GstSample* gstVideoSinkSample = gst_app_sink_pull_sample( GST_APP_SINK(
appsink ) );
GstBuffer* gstBuffer = gst_sample_get_buffer( gstVideoSinkSample );
if ( !gst_video_frame_map( &gstFrame, &gstInfo, gstBuffer,
static_cast<GstMapFlags>( GST_MAP_READ | ( GST_MAP_FLAG_LAST << 1 ) ) ) )
{
errorToConsole( true, "Failed to map video frame" );
}
GLuint textureId = *(guint *) gstFrame.data[0];
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:
glBindTexture(target, texture);
glGetTexLevelParameteriv(target, 0, GL_TEXTURE_WIDTH, &w);
glGetTexLevelParameteriv(target, 0, GL_TEXTURE_HEIGHT, &h);
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!
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!
Regards,
Lasse
--
Lasse Farnung Laursen
Researcher at the University of Tokyo
www.lasselaursen.com <http://www.lasselaursen.com>
Twitter: @PMP_J <https://twitter.com/PMP_J>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20150115/1c5bea29/attachment-0001.html>
More information about the gstreamer-devel
mailing list