<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.E-MailFormatvorlage17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=DE link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Dear Members,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>i am trying to change a glshader element at runtime in a native Gstreamer application.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The idea is to convert a rtsp Stream to an side-by-side view for a android google cardboard VR device.<o:p></o:p></p><p class=MsoNormal>I want to implement headtracking as well and therefore want to change the opengl fragment dynamically based on head position.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The code below works for a static .frag file.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal style='text-autospace:none'>QUESTION: How can i change for example <o:p></o:p></p><p class=MsoNormal style='text-autospace:none'><u><span style='font-size:10.0pt;font-family:"Courier New";color:black'>const</span></u><span style='font-size:10.0pt;font-family:"Courier New"'> vec2 leftCenter = vec2(0.25, 0.4);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><u><span style='font-size:10.0pt;font-family:"Courier New";color:black'>const</span></u><span style='font-size:10.0pt;font-family:"Courier New"'> vec2 rightCenter = vec2(0.75, 0.4);<o:p></o:p></span></p><p class=MsoNormal>DYNAMICALLY during runtime in the native code?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>There used tob o something like gstglfiltershader, but i can not find a similar functionality in the current 1.4.x releases.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks!!!!<o:p></o:p></p><p class=MsoNormal>Kind regards<o:p></o:p></p><p class=MsoNormal>Christian<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The current Pipeline is set up as follows (JNI Code for an Android App).<o:p></o:p></p><p class=MsoNormal>This <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>                ….<o:p></o:p></p><p class=MsoNormal>                // rtspsrc location=rtsp://192.168.137.240:8554/test latency=0 drop-on-latency=true ! application/x-rtp, payload=96 ! rtph264depay ! decodebin ! glimagesink  sync=false<o:p></o:p></p><p class=MsoNormal>                data->source = gst_element_factory_make ("rtspsrc","rtspsrc");<o:p></o:p></p><p class=MsoNormal>                g_object_set(G_OBJECT (data->source),"location",pipelineParameterFromJava,"latency",0,"drop-on-latency",true,NULL);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>                data->pipeline = gst_pipeline_new ("fpv-pipeline");<o:p></o:p></p><p class=MsoNormal>                data->filter=gst_element_factory_make("capsfilter","filter");<o:p></o:p></p><p class=MsoNormal>                data->depayloader  = gst_element_factory_make ("rtph264depay","rtph264depay");<o:p></o:p></p><p class=MsoNormal>                data->decoder  = gst_element_factory_make ("decodebin","decodebin");<o:p></o:p></p><p class=MsoNormal>                data->distortion = gst_element_factory_make ("glshader","glshader");<o:p></o:p></p><p class=MsoNormal>                data->video_sink = gst_element_factory_make ("glimagesink","glimagesink");<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>                filtercaps = gst_caps_new_simple ("application/x-rtp","payload", G_TYPE_INT, 96,NULL);<o:p></o:p></p><p class=MsoNormal>                g_object_set (G_OBJECT (data->filter), "caps", filtercaps, NULL);<o:p></o:p></p><p class=MsoNormal>                g_object_set (G_OBJECT (data->distortion), "location", "/data/data/com.lonestar.groundpi/files/distortion.frag", NULL);<o:p></o:p></p><p class=MsoNormal>                gst_caps_unref (filtercaps);<o:p></o:p></p><p class=MsoNormal>                g_object_set(G_OBJECT (data->video_sink),"sync",false,NULL);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>                if (!data->pipeline || !data->source || !data->filter || !data->depayloader || !data->decoder || !data->video_sink || !data->distortion) {<o:p></o:p></p><p class=MsoNormal>                  g_printerr ("One element could not be created. Exiting.\n");<o:p></o:p></p><p class=MsoNormal>                  return -1;<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>                gst_bin_add_many (GST_BIN (data->pipeline), data->source, data->filter, data->depayloader, data->decoder, data->video_sink, data->distortion, NULL);<o:p></o:p></p><p class=MsoNormal>                gst_element_link_many (data->filter, data->depayloader, data->decoder, NULL);<o:p></o:p></p><p class=MsoNormal>                gst_element_link_many (data->distortion, data->video_sink, NULL);<o:p></o:p></p><p class=MsoNormal>                g_signal_connect (data->source, "pad-added", G_CALLBACK (cb_new_pad), data->filter);<o:p></o:p></p><p class=MsoNormal>                g_signal_connect (data->decoder, "pad-added", G_CALLBACK (cb_new_pad), data->distortion);<o:p></o:p></p><p class=MsoNormal style='text-indent:35.4pt'>….<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Distortion.frag:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>#extension GL_ARB_texture_rectangle : enable<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>precision <u><span style='color:black'>mediump</span></u> float;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>varying vec2 v_texcoord;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>uniform sampler2D <u><span style='color:black'>tex</span></u>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> <o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><u><span style='font-size:10.0pt;font-family:"Courier New";color:black'>const</span></u><span style='font-size:10.0pt;font-family:"Courier New"'> vec4 <u><span style='color:black'>kappa</span></u> = vec4(2.75,1.7,0.5,0.5);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><u><span style='font-size:10.0pt;font-family:"Courier New";color:black'>const</span></u><span style='font-size:10.0pt;font-family:"Courier New"'> float screen_width = 1920.0;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><u><span style='font-size:10.0pt;font-family:"Courier New";color:black'>const</span></u><span style='font-size:10.0pt;font-family:"Courier New"'> float screen_height = 1080.0;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><u><span style='font-size:10.0pt;font-family:"Courier New";color:black'>const</span></u><span style='font-size:10.0pt;font-family:"Courier New"'> float scaleFactor = 0.62;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><u><span style='font-size:10.0pt;font-family:"Courier New";color:black'>const</span></u><span style='font-size:10.0pt;font-family:"Courier New"'> vec2 leftCenter = vec2(0.25, 0.4);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><u><span style='font-size:10.0pt;font-family:"Courier New";color:black'>const</span></u><span style='font-size:10.0pt;font-family:"Courier New"'> vec2 rightCenter = vec2(0.75, 0.4);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><u><span style='font-size:10.0pt;font-family:"Courier New";color:black'>const</span></u><span style='font-size:10.0pt;font-family:"Courier New"'> float separation = -0.025;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><u><span style='font-size:10.0pt;font-family:"Courier New";color:black'>const</span></u><span style='font-size:10.0pt;font-family:"Courier New"'> <u><span style='color:black'>bool</span></u> stereo_input = false;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> <o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>// Scales input texture coordinates for distortion.<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>vec2 hmdWarp(vec2 LensCenter, vec2 texCoord, vec2 Scale, vec2 ScaleIn) {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>vec2 <u><span style='color:black'>theta</span></u> = (texCoord - LensCenter) * ScaleIn;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>float rSq = theta.x * theta.x + theta.y * theta.y;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>vec2 <u><span style='color:black'>rvector</span></u> = <u><span style='color:black'>theta</span></u> * (kappa.x + kappa.y * rSq + kappa.z * rSq * rSq + kappa.w * rSq * rSq * rSq);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>vec2 <u><span style='color:black'>tc</span></u> = LensCenter + Scale * <u><span style='color:black'>rvector</span></u>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>return <u><span style='color:black'>tc</span></u>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>}<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> <o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><u><span style='font-size:10.0pt;font-family:"Courier New";color:black'>bool</span></u><span style='font-size:10.0pt;font-family:"Courier New"'> validate(vec2 <u><span style='color:black'>tc</span></u>, <u><span style='color:black'>int</span></u> eye) {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>if ( stereo_input ) {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>//keep within bounds of texture<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>if ((eye == 1 && (tc.x < 0.0 || tc.x > 0.5)) ||<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>(eye == 0 && (tc.x < 0.5 || tc.x > 1.0)) ||<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>tc.y < 0.0 || tc.y > 1.0) {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>return false;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>}<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>} else {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>if ( tc.x < 0.0 || tc.x > 1.0 ||<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>tc.y < 0.0 || tc.y > 1.0 ) {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>return false;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>}<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>}<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>return true;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>}<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> <o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>void main() {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>float as = float(screen_width / 2.0) / float(screen_height);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>vec2 Scale = vec2(0.25, as);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>vec2 ScaleIn = vec2(2.0 * scaleFactor, 1.0 / as * scaleFactor);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> <o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>vec2 texCoord = v_texcoord;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>vec2 <u><span style='color:black'>tc</span></u> = vec2(0);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>vec4 color = vec4(0);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>if ( texCoord.x < 0.5 ) {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>texCoord.x += separation;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>texCoord = hmdWarp(leftCenter, texCoord, Scale, ScaleIn );<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>if ( !stereo_input ) {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>texCoord.x *= 2.0;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>}<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>color = texture2D(<u><span style='color:black'>tex</span></u>, texCoord);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>if ( !validate(texCoord, 0) ) {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>color = vec4(0);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>}<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>} else {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>texCoord.x -= separation;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>texCoord = hmdWarp(rightCenter, texCoord, Scale, ScaleIn);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>if ( !stereo_input ) {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>texCoord.x = (texCoord.x - 0.5) * 2.0;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>}<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>color = texture2D(<u><span style='color:black'>tex</span></u>, texCoord);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>if ( !validate(texCoord, 1) ) {<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>color = vec4(0);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>}<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>}<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>gl_FragColor = color;<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>}</span><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>