[vlc-devel] [PATCH 1/2] demux/subtitles: add new implementation for line-peeking
Rémi Denis-Courmont
remi at remlab.net
Sun Nov 6 20:29:20 CET 2016
Le sunnuntaina 6. marraskuuta 2016, 17.58.44 EET Filip Roséen a écrit :
> This added function properly handles streams where an initial BOM is
> used to state the encoding used, effectively making sure that we do
> not forget about the encoding of the stream while peeking lines.
> ---
> modules/demux/subtitle_helper.h | 75
> +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+)
>
> diff --git a/modules/demux/subtitle_helper.h
> b/modules/demux/subtitle_helper.h index b5f18da..fc71c12 100644
> --- a/modules/demux/subtitle_helper.h
> +++ b/modules/demux/subtitle_helper.h
> @@ -18,6 +18,9 @@
> * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
>
> ***************************************************************************
> **/
>
> +#include <vlc_common.h>
> +#include <vlc_stream.h>
> +
> inline static char * peek_Readline( stream_t *p_demuxstream, uint64_t
> *pi_offset ) {
> uint8_t *p_peek;
> @@ -43,3 +46,75 @@ inline static char * peek_Readline( stream_t
> *p_demuxstream, uint64_t *pi_offset
>
> return psz_line;
> }
> +
> +/**
> + * Peek next line of stream
> + *
> + * This function returns the next available line in \p p_source
> + * without modifying the read-offset of the stream (meaning that it
> + * effectivelly it behaves like vlc_stream_Peek, but for lines).
> + *
> + * \param source The stream for which line-peeking shall be made
> + * \param peekstate shall be NULL on first invocation, and `*peekstate`
> + * will be updated to reflect the internal state of the
> + * peeking.
> + *
> + * \warning if `*peekstate` is not NULL, it shall be released by the
> + * callee when no more data is desired to be peeked (using
> + * \link vlc_stream_Delete).
> + *
> + * \return pointer to the next line (if any), must be freed by the
> + * callee.
> + **/
> +inline static char * subtitle_PeekLine( stream_t *source, stream_t
> **peekstate ) +{
> + for( uint64_t offset = 0, size = 0;; )
> + {
> + char* line = NULL;
> +
> + if( *peekstate )
> + {
> + if( vlc_stream_GetSize( *peekstate, &size ) )
> + return NULL;
The whole point of the faulty commit was to support probing subtitles from
nonseekable streams. Nonseekable streams typically do not have a known size,
so this is an extremely dubious requirement.
In other words, reverting the faulty commit would be a lot easier.
> +
> + offset = vlc_stream_Tell( *peekstate );
> + line = vlc_stream_ReadLine( *peekstate );
Likewise, you can´t do that here; this is missing the point.
> +
> + if( line && vlc_stream_Tell( *peekstate ) < size )
> + return line;
> + }
> +
> + uint8_t const* data;
> + ssize_t peeked = vlc_stream_Peek( source, &data, size + 2048 );
> +
> + if( peeked > 0 && (uint64_t)peeked <= size )
> + return line;
> + else
> + free( line );
> +
> + if( peeked < 0 )
> + return NULL;
> +
> + if( *peekstate )
> + {
> + vlc_stream_Delete( *peekstate );
> + *peekstate = NULL;
> + }
> +
> + *peekstate = vlc_stream_MemoryNew( source, (uint8_t*)data,
> + peeked, true );
> + if( unlikely( !*peekstate ) )
> + return NULL;
> +
> + if( offset != 0 )
> + {
> + /* read potential BOM */
> + free( vlc_stream_ReadLine( *peekstate ) );
> +
> + if( vlc_stream_Seek( *peekstate, offset ) )
> + return NULL;
> + }
> + }
> +
> + vlc_assert_unreachable();
> +}
--
Rémi Denis-Courmont
http://www.remlab.net/
More information about the vlc-devel
mailing list