From: David Flynn Date: Thu, 27 Nov 2008 11:58:52 +0000 (+0000) Subject: mux/ogg: Don't use granulepos = UINT64_MAX on EOS page X-Git-Tag: 1.0.0-pre1~1987 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=85dd1a0b762517a9c6f1c721c30bdce233c25dd0;p=vlc mux/ogg: Don't use granulepos = UINT64_MAX on EOS page It isn't legal for granulepos to be UINT64_MAX on an EOS page since this special value indicates that no packets finish on the page, yet an EOS page signifies that the final packet does finish on the page. It seems that there is a convention for repeating the last used granulepos in the EOS page per logical stream. This then allows some extra file size hints (duration = last gp - first gp) [1] [1] This is flawed -- EOS may occur anywhere, however this is what some people do. Signed-off-by: David Flynn Signed-off-by: Laurent Aimar --- diff --git a/modules/mux/ogg.c b/modules/mux/ogg.c index 242a3c762c..26ddeee4ca 100644 --- a/modules/mux/ogg.c +++ b/modules/mux/ogg.c @@ -184,6 +184,7 @@ typedef struct int i_serial_no; int i_keyframe_granule_shift; /* Theora only */ int i_last_keyframe; /* dirac and eventually theora */ + uint64_t u_last_granulepos; /* Used for correct EOS page */ ogg_stream_state os; oggds_header_t *p_oggds_header; @@ -851,7 +852,7 @@ static block_t *OggCreateFooter( sout_mux_t *p_mux ) op.bytes = 0; op.b_o_s = 0; op.e_o_s = 1; - op.granulepos = -1; + op.granulepos = p_stream->u_last_granulepos; op.packetno = p_stream->i_packet_no++; ogg_stream_packetin( &p_stream->os, &op ); @@ -866,7 +867,7 @@ static block_t *OggCreateFooter( sout_mux_t *p_mux ) op.bytes = 0; op.b_o_s = 0; op.e_o_s = 1; - op.granulepos = -1; + op.granulepos = p_sys->pp_del_streams[i]->u_last_granulepos; op.packetno = p_sys->pp_del_streams[i]->i_packet_no++; ogg_stream_packetin( &p_sys->pp_del_streams[i]->os, &op ); @@ -1039,6 +1040,7 @@ static int MuxBlock( sout_mux_t *p_mux, sout_input_t *p_input ) op.granulepos = ( p_data->i_dts - p_sys->i_start_dts ) / 1000; } + p_stream->u_last_granulepos = op.granulepos; ogg_stream_packetin( &p_stream->os, &op ); if( p_stream->i_cat == SPU_ES ||