<div dir="ltr"><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px">Yashil,</span><br><div><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px">Thanks very much for that.</span></div>

<div><span style="color:rgb(80,0,80);font-family:arial,sans-serif">My real intention is to be notified when the playback reaches a given frame number, instead of doing seek.</span></div><div><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px">But even though, it is going to be very useful on solving another issue in a near future.</span></div>

<div><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px">Thanks again,</span></div><div><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px">Marcus</span></div>

<div><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px"><br></span></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Nov 4, 2013 at 3:57 AM, Yashil <span dir="ltr"><<a href="mailto:yashil1@yahoo.com" target="_blank">yashil1@yahoo.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Marcus Nascimento wrote<br>
<div class="im">> Hi Yashil,<br>
><br>
> I'm very interested in this solution too.<br>
> I believe you are a bit ahead of me.<br>
> Please, let me know if you find a good solution.<br>
><br>
> If I manage to do it, I'll let you know.<br>
><br>
> Thanks very much,<br>
> Marcus<br>
<br>
</div>Here is my sample code. It grabs two frames from given video file and<br>
displays it by opencv. The first frame seek is done by given frame number<br>
and the second frame seek is done by given time position. It works for<br>
several codecs in my tests but I have not been able to make it work for<br>
mpeg2-ts files yet.<br>
<br>
MyGstFrameCap1.cpp<br>
<br>
/**********************************************************************/<br>
// gstreamer includes and libraries<br>
#include <gst/gst.h><br>
#include <gst/app/gstappsink.h><br>
#pragma comment( lib, "gstreamer-1.0.lib" )<br>
#pragma comment( lib, "glib-2.0.lib" )<br>
#pragma comment( lib, "gobject-2.0.lib" )<br>
#pragma comment( lib, "gstapp-1.0.lib" )<br>
<br>
/**********************************************************************/<br>
// opencv includes and libraries<br>
#include <opencv2/opencv.hpp><br>
#ifdef _DEBUG<br>
#pragma comment( lib, "comctl32" )<br>
#pragma comment( lib, "opencv_core246d" )<br>
#pragma comment( lib, "opencv_highgui246d" )<br>
#ifndef _DLL<br>
#pragma comment( lib, "zlibd" )<br>
#pragma comment( lib, "IlmImfd" )<br>
#pragma comment( lib, "libjasperd" )<br>
#pragma comment( lib, "libjpegd" )<br>
#pragma comment( lib, "libpngd" )<br>
#pragma comment( lib, "libtiffd" )<br>
#endif<br>
#else<br>
#pragma comment( lib, "comctl32" )<br>
#pragma comment( lib, "opencv_core246" )<br>
#pragma comment( lib, "opencv_highgui246" )<br>
#ifndef _DLL<br>
#pragma comment( lib, "zlib" )<br>
#pragma comment( lib, "IlmImf" )<br>
#pragma comment( lib, "libjasper" )<br>
#pragma comment( lib, "libjpeg" )<br>
#pragma comment( lib, "libpng" )<br>
#pragma comment( lib, "libtiff" )<br>
#endif<br>
#endif<br>
<br>
/**********************************************************************/<br>
void MyfCopyRGBbuf2CvMat( cv::Mat& oMatFrameInp, unsigned char *pDataInp )<br>
{<br>
        int nDi = 0;<br>
        for( int nRi = 0; nRi < oMatFrameInp.rows; nRi++ )<br>
        {<br>
                for( int nCi = 0; nCi < oMatFrameInp.cols; nCi++ )<br>
                {<br>
                        oMatFrameInp.data[oMatFrameInp.step[0] * nRi + oMatFrameInp.step[1] * nCi<br>
+ 2] = pDataInp[nDi++]; // R<br>
                        oMatFrameInp.data[oMatFrameInp.step[0] * nRi + oMatFrameInp.step[1] * nCi<br>
+ 1] = pDataInp[nDi++]; // G<br>
                        oMatFrameInp.data[oMatFrameInp.step[0] * nRi + oMatFrameInp.step[1] * nCi<br>
+ 0] = pDataInp[nDi++]; // B<br>
                }<br>
        }<br>
}<br>
<br>
/**********************************************************************/<br>
void MyfDispGstSampleInOpenCvWin( GstSample *pstGstSampleInp, gchar<br>
*szgWinTitle )<br>
{<br>
        if( !pstGstSampleInp ) { g_print( "*** Error: Could not make snapshot (may<br>
be due to eos)."); return; }<br>
<br>
        GstCaps *pstGstCaps1;<br>
        pstGstCaps1 = gst_sample_get_caps( pstGstSampleInp );<br>
        if( !pstGstCaps1 ) { g_print( "*** Error: gst_sample_get_caps fails to get<br>
sample cpas." ); return; }<br>
<br>
        GstStructure *pstGstSt1;<br>
        pstGstSt1 = gst_caps_get_structure( pstGstCaps1, 0 );<br>
<br>
        gint nFrameWidth, nFrameHeight;<br>
        gboolean nGboolRes1;<br>
        nGboolRes1 = gst_structure_get_int( pstGstSt1, "width", &nFrameWidth );<br>
        nGboolRes1 |= gst_structure_get_int( pstGstSt1, "height", &nFrameHeight );<br>
        if( !nGboolRes1 ) { g_print( "*** Error: gst_structure_get_int fails to get<br>
snapshot dimension."); return; }<br>
<br>
        GstBuffer *pstGstBuffer1;<br>
        pstGstBuffer1 = gst_sample_get_buffer( pstGstSampleInp );<br>
        GstMapInfo stGstMapInfo1;<br>
        gst_buffer_map( pstGstBuffer1, &stGstMapInfo1, GST_MAP_READ );<br>
<br>
        cv::Mat oMatTstFrame;<br>
        oMatTstFrame = cv::Mat::zeros( nFrameHeight, nFrameWidth, CV_8UC3 );<br>
        MyfCopyRGBbuf2CvMat( oMatTstFrame, stGstMapInfo1.data );<br>
<br>
        gst_buffer_unmap( pstGstBuffer1, &stGstMapInfo1 );<br>
<br>
        cv::namedWindow( szgWinTitle, CV_WINDOW_AUTOSIZE );<br>
        cv::imshow( szgWinTitle, oMatTstFrame );<br>
}<br>
<br>
//********************************************************************************<br>
int     main( int argc, char *argv[] )<br>
{<br>
        gst_init( &argc, &argv );<br>
<br>
        // Describe pipeline<br>
        gchar *szgPipelineDescStr1;<br>
        szgPipelineDescStr1 = g_strdup_printf( "uridecodebin<br>
uri=\"file:///D:/QuickTimeSample.mov\" ! videoconvert ! videoscale ! appsink<br>
name=sink caps=\"video/x-raw,format=RGB\"" ); // Works for both frame and<br>
time seek<br>
        //szgPipelineDescStr1 = g_strdup_printf( "uridecodebin<br>
uri=\"file:///D:/mpts_out.ts\" ! videoconvert ! videoscale ! appsink<br>
name=sink caps=\"video/x-raw,format=RGB\"" ); // NOT works for both frame<br>
and time seek<br>
<br>
        // Create pipeline<br>
        GstElement *pstGstElemPipeline1;<br>
        GError *pstGErr1 = NULL;<br>
        pstGstElemPipeline1 = gst_parse_launch( szgPipelineDescStr1, &pstGErr1 );<br>
        if( pstGErr1 != NULL )<br>
        {<br>
                g_print( "could not construct pipeline: %s\n", pstGErr1->message );<br>
                g_error_free( pstGErr1 ); return( -1 );<br>
        }<br>
<br>
        // Set to GST_STATE_PAUSED<br>
        GstStateChangeReturn nStateChgRet;<br>
        nStateChgRet = gst_element_set_state( pstGstElemPipeline1, GST_STATE_PAUSED<br>
);<br>
        if( nStateChgRet == GST_STATE_CHANGE_FAILURE ) goto Cleanup;<br>
        nStateChgRet = gst_element_get_state( pstGstElemPipeline1, NULL, NULL, 5 *<br>
GST_SECOND );<br>
        if( nStateChgRet == GST_STATE_CHANGE_FAILURE ) goto Cleanup;<br>
<br>
        // Set desired frame number to be displayed<br>
        gint64 nDesiredMediaPosFrameNum = 120;<br>
<br>
        // Init required variables<br>
        GstElement *pstGstElemAppSink1;<br>
        pstGstElemAppSink1 = gst_bin_get_by_name( GST_BIN( pstGstElemPipeline1 ),<br>
"sink" );<br>
        gboolean nGboolRes1;<br>
        char *szgWinTitle;<br>
<br>
        // Seek by GST_FORMAT_DEFAULT<br>
        nGboolRes1 = gst_element_seek_simple( pstGstElemPipeline1,<br>
GST_FORMAT_DEFAULT,      (GstSeekFlags) ( GST_SEEK_FLAG_ACCURATE |<br>
GST_SEEK_FLAG_FLUSH ), nDesiredMediaPosFrameNum );<br>
        if( !nGboolRes1 ) { g_print( "*** Error: gst_element_seek_simple by<br>
GST_FORMAT_DEFAULT failed!\n"); }<br>
<br>
        // Read sample<br>
        GstSample *pstGstSample1;<br>
        pstGstSample1 = gst_app_sink_pull_preroll( (GstAppSink *)<br>
pstGstElemAppSink1 ); // or g_signal_emit_by_name( pstGstElemAppSink1,<br>
"pull-preroll", &pstGstSample1, NULL );<br>
<br>
        // Display sample<br>
        szgWinTitle = g_strdup_printf( "Frame #%lld", nDesiredMediaPosFrameNum );<br>
        MyfDispGstSampleInOpenCvWin( pstGstSample1, szgWinTitle );<br>
<br>
<br>
        // Set desired position by time to be displayed<br>
        gint64 nDesiredMediaPosNanoSec = 1000 * GST_MSECOND;<br>
<br>
        // Seek by GST_FORMAT_DEFAULT<br>
        nGboolRes1 = gst_element_seek_simple( pstGstElemPipeline1, GST_FORMAT_TIME,<br>
(GstSeekFlags) ( GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH ),<br>
nDesiredMediaPosNanoSec );<br>
        if( !nGboolRes1 ) { g_print( "*** Error: gst_element_seek_simple by<br>
GST_FORMAT_TIME failed!\n"); }<br>
<br>
        // Read sample<br>
        GstSample *pstGstSample2;<br>
        pstGstSample2 = gst_app_sink_pull_preroll( (GstAppSink *)<br>
pstGstElemAppSink1 );<br>
<br>
        // Display sample<br>
        szgWinTitle = g_strdup_printf( "Time %" GST_TIME_FORMAT, GST_TIME_ARGS(<br>
nDesiredMediaPosNanoSec ) );<br>
        MyfDispGstSampleInOpenCvWin( pstGstSample2, szgWinTitle );<br>
<br>
Cleanup:<br>
        gst_element_set_state( pstGstElemPipeline1, GST_STATE_NULL );<br>
        gst_object_unref( pstGstElemPipeline1 );<br>
<br>
        g_print( "Press any key to finish...\n");<br>
        cvWaitKey( 0 );<br>
        return( 0 );<br>
}<br>
<br>
<br>
Note:<br>
Include directories:<br>
D:\gstreamer\1.0\x86\include\gstreamer-1.0;D:\gstreamer\1.0\x86\include\glib-2.0;D:\gstreamer\1.0\x86\lib\glib-2.0\include;D:\opencv246\build\include\<br>
<br>
Library directories:<br>
d:\opencv246\build\x86\vc11\staticlib;D:\gstreamer\1.0\x86\lib<br>
<br>
<br>
<br>
<br>
--<br>
View this message in context: <a href="http://gstreamer-devel.966125.n4.nabble.com/How-to-read-an-specified-frame-from-an-MPEG-TS-video-file-tp4663005p4663079.html" target="_blank">http://gstreamer-devel.966125.n4.nabble.com/How-to-read-an-specified-frame-from-an-MPEG-TS-video-file-tp4663005p4663079.html</a><br>


<div class="HOEnZb"><div class="h5">Sent from the GStreamer-devel mailing list archive at Nabble.com.<br>
_______________________________________________<br>
gstreamer-devel mailing list<br>
<a href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>Marcus Nascimento<br><br>
</div>