<div dir="ltr">The video output is messed up if we only do a stream_Seek(). If we want<br>to seeking forward, we should decode and discard pictures to keep the<br>decoder at the right state. For seeking backward, seeking to the<br>beginning and decode from there. Since the bitrate is very low and the<br>decodeing process is really simple, there is no obvious delay. I have<br>tested this strategy on a dual core ARM board.<br>---<br> modules/codec/cdg.c |  2 +-<br> modules/demux/cdg.c | 26 ++++++++++++++++++++++----<br> 2 files changed, 23 insertions(+), 5 deletions(-)<br><br>diff --git a/modules/codec/cdg.c b/modules/codec/cdg.c<br>index 98c07c8..763ba1a 100644<br>--- a/modules/codec/cdg.c<br>+++ b/modules/codec/cdg.c<br>@@ -158,7 +158,7 @@ static picture_t *Decode( decoder_t *p_dec, block_t **pp_block )<br>     }<br> <br>     /* Only display 25 frame per second (there is 75 packets per second) */<br>-    if( (p_sys->i_packet%3) == 1 )<br>+    if( (p_sys->i_packet%3) == 1 && p_block->i_pts == p_block->i_dts )<br>     {<br>         /* Get a new picture */<br>         p_pic = decoder_NewPicture( p_dec );<br>diff --git a/modules/demux/cdg.c b/modules/demux/cdg.c<br>index 212a4f3..14df882 100644<br>--- a/modules/demux/cdg.c<br>+++ b/modules/demux/cdg.c<br>@@ -119,6 +119,10 @@ static int Demux( demux_t *p_demux )<br> {<br>     demux_sys_t *p_sys = p_demux->p_sys;<br>     block_t     *p_block;<br>+    mtime_t     i_date;<br>+    mtime_t     i_delta;<br>+<br>+    i_delta = INT64_C(1000000) / CDG_FRAME_RATE;<br> <br>     p_block = stream_Block( p_demux->s, CDG_FRAME_SIZE );<br>     if( p_block == NULL )<br>@@ -127,15 +131,22 @@ static int Demux( demux_t *p_demux )<br>         return 0;<br>     }<br> <br>-    p_block->i_dts =<br>-    p_block->i_pts = VLC_TS_0 + date_Get( &p_sys->pts );<br>+    i_date = stream_Tell( p_demux->s ) / CDG_FRAME_SIZE * i_delta;<br>+    if( i_date >= date_Get( &p_sys->pts ) + i_delta )<br>+    {<br>+        p_block->i_dts = p_block->i_pts = i_date;<br>+        date_Set( &p_sys->pts, i_date );<br>+    }<br>+    else<br>+    {<br>+        p_block->i_dts = i_date;<br>+        p_block->i_pts = date_Get( &p_sys->pts );<br>+    }<br> <br>     es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts );<br> <br>     es_out_Send( p_demux->out, p_sys->p_es, p_block );<br> <br>-    date_Increment( &p_sys->pts, 1 );<br>-<br>     return 1;<br> }<br> <br>@@ -155,13 +166,20 @@ static void Close ( vlc_object_t * p_this )<br>  *****************************************************************************/<br> static int Control( demux_t *p_demux, int i_query, va_list args )<br> {<br>+    uint64_t i_old_offset = stream_Tell( p_demux->s );<br>     int i_ret = demux_vaControlHelper( p_demux->s, 0, -1,<br>                                        8*CDG_FRAME_SIZE*CDG_FRAME_RATE, CDG_FRAME_SIZE,<br>                                        i_query, args );<br>     if( !i_ret && ( i_query == DEMUX_SET_POSITION || i_query == DEMUX_SET_TIME ) )<br>+    {<br>         date_Set( &p_demux->p_sys->pts,<br>                   stream_Tell( p_demux->s ) / CDG_FRAME_SIZE *<br>                     INT64_C(1000000) / CDG_FRAME_RATE );<br>+        if ( i_old_offset > stream_Tell( p_demux->s ) )<br>+            i_ret = stream_Seek( p_demux->s, 0 );<br>+        else<br>+            i_ret = stream_Seek( p_demux->s, i_old_offset );<br>+    }<br> <br>     return i_ret;<br> }<br>-- <br>1.9.1<br><br></div>