X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fdirac.c;h=48908330b2ed033c3665edf890469fd241bae882;hb=db37ca8b6a4f301c8108d100a86184a930f2e875;hp=4cfd537fdc64395953ed37ea07bb9a3da0a9433e;hpb=78d87996ccb92d1dc91c9987685f976ed3be08a6;p=vlc diff --git a/modules/demux/dirac.c b/modules/demux/dirac.c index 4cfd537fdc..48908330b2 100644 --- a/modules/demux/dirac.c +++ b/modules/demux/dirac.c @@ -1,25 +1,25 @@ /***************************************************************************** * dirac.c : Dirac Video demuxer ***************************************************************************** - * Copyright (C) 2002-2008 the VideoLAN team + * Copyright (C) 2002-2008 VLC authors and VideoLAN * $Id$ * * Authors: David Flynn * Based on vc1.c by: Laurent Aimar * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -33,7 +33,7 @@ #include #include #include -#include "vlc_codec.h" +#include #define DEMUX_CFG_PREFIX "dirac-" @@ -53,9 +53,10 @@ vlc_module_begin(); set_subcategory( SUBCAT_INPUT_DEMUX ); set_description( N_("Dirac video demuxer" ) ); set_capability( "demux", 50 ); - add_integer( DEMUX_CFG_PREFIX DEMUX_DTSOFFSET, 0, NULL, + add_integer( DEMUX_CFG_PREFIX DEMUX_DTSOFFSET, 0, DEMUX_DTSOFFSET_TEXT, DEMUX_DTSOFFSET_LONGTEXT, false ) set_callbacks( Open, Close ); + add_shortcut( "dirac" ) vlc_module_end(); /***************************************************************************** @@ -68,7 +69,12 @@ struct demux_sys_t mtime_t i_pts_offset_lowtide; es_out_id_t *p_es; - bool b_first; + enum { + /* demuxer states, do not reorder (++ is used) */ + DIRAC_DEMUX_DISCONT = 0, /* signal a discontinuity to packetizer */ + DIRAC_DEMUX_FIRST, /* provide an origin timestamp for the packetizer */ + DIRAC_DEMUX_STEADY, /* normal operation */ + } i_state; decoder_t *p_packetizer; }; @@ -105,7 +111,7 @@ static int Open( vlc_object_t * p_this ) if( !p_sys ) return VLC_ENOMEM; p_sys->i_pts_offset_lowtide = INT64_MAX; - p_sys->b_first = true; + p_sys->i_state = DIRAC_DEMUX_FIRST; p_sys->i_dtsoffset = var_CreateGetInteger( p_demux, DEMUX_CFG_PREFIX DEMUX_DTSOFFSET ); @@ -150,30 +156,29 @@ static int Demux( demux_t *p_demux) demux_sys_t *p_sys = p_demux->p_sys; block_t *p_block_in, *p_block_out; - if( ( p_block_in = stream_Block( p_demux->s, DIRAC_PACKET_SIZE ) ) == NULL ) + if( p_sys->i_state == DIRAC_DEMUX_DISCONT ) { - return 0; + p_sys->i_state++; + p_block_in = block_Alloc( 128 ); + if( p_block_in ) + { + p_block_in->i_flags = BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED; + } } - - if( p_sys->b_first ) + else { - p_sys->b_first = false; - /* by default, timestamps are invalid. - * Except when we need an anchor point */ -#if VLC_TS_INVALID == 0 - /* xxx: to be removed in 1.1 */ - p_block_in->i_dts = 1; -#else - p_block_in->i_dts = 0; -#endif - - block_t *p_null = block_Alloc( 128 ); - if( p_null ) + p_block_in = stream_Block( p_demux->s, DIRAC_PACKET_SIZE ); + if( !p_block_in ) + { + return 0; + } + if ( p_sys->i_state == DIRAC_DEMUX_FIRST) { - p_null->i_flags = BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED; - p_null->p_next = p_block_in; + p_sys->i_state++; + /* by default, timestamps are invalid. + * Except when we need an anchor point */ + p_block_in->i_dts = VLC_TS_0; } - p_block_in = p_null; } while( (p_block_out = p_sys->p_packetizer->pf_packetize( p_sys->p_packetizer, &p_block_in )) ) @@ -233,7 +238,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) { if( DEMUX_SET_POSITION == i_query || DEMUX_SET_TIME == i_query ) { - p_sys->b_first = true; + p_sys->i_state = DIRAC_DEMUX_DISCONT; } return demux_vaControlHelper( p_demux->s, 0, -1, 0, 1, i_query, args ); }