X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fdirac.c;h=48908330b2ed033c3665edf890469fd241bae882;hb=400c8feb03f76354c4b79fc6f150156c3484d398;hp=6399c840bb649dfe2a6829650fe838cac7c4aa39;hpb=710bd9a4a69b000a21b95b63fde109205936bf5a;p=vlc diff --git a/modules/demux/dirac.c b/modules/demux/dirac.c index 6399c840bb..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-" @@ -52,10 +52,11 @@ vlc_module_begin(); set_category( CAT_INPUT ); set_subcategory( SUBCAT_INPUT_DEMUX ); set_description( N_("Dirac video demuxer" ) ); - set_capability( "demux", 200 ); - add_integer( DEMUX_CFG_PREFIX DEMUX_DTSOFFSET, 0, NULL, + set_capability( "demux", 50 ); + 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,12 +111,12 @@ 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 ); /* Load the packetizer */ - es_format_Init( &fmt, VIDEO_ES, VLC_FOURCC( 'd','r','a','c' ) ); + es_format_Init( &fmt, VIDEO_ES, VLC_CODEC_DIRAC ); p_sys->p_packetizer = demux_PacketizerNew( p_demux, &fmt, "dirac" ); if( !p_sys->p_packetizer ) { @@ -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; - 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 )) ) @@ -184,10 +189,7 @@ static int Demux( demux_t *p_demux) p_block_out->p_next = NULL; if( p_sys->p_es == NULL ) - { - p_sys->p_packetizer->fmt_out.b_packetized = true; p_sys->p_es = es_out_Add( p_demux->out, &p_sys->p_packetizer->fmt_out); - } p_block_out->i_dts += p_sys->i_dtsoffset; p_sys->i_dts = p_block_out->i_dts; @@ -236,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 ); }