[vlc-commits] flac encoders: use the long format extradata
Rafaël Carré
git at videolan.org
Wed Aug 21 00:10:40 CEST 2013
vlc/vlc-2.1 | branch: master | Rafaël Carré <funman at videolan.org> | Tue Aug 20 23:56:03 2013 +0200| [2db4585691faaaf18e1d8efd235782a6e86795dc] | committer: Jean-Baptiste Kempf
flac encoders: use the long format extradata
fLaC marker is helpful for file format detection
(cherry picked from commit 6d40f995b0f65c68fad7e2aea68d3337df1ea708)
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc/vlc-2.1.git/?a=commit;h=2db4585691faaaf18e1d8efd235782a6e86795dc
---
modules/codec/avcodec/encoder.c | 37 +++++++++++++++++++++++++++++++------
modules/codec/flac.c | 9 ++++++---
2 files changed, 37 insertions(+), 9 deletions(-)
diff --git a/modules/codec/avcodec/encoder.c b/modules/codec/avcodec/encoder.c
index 6b32bc0..c16efac 100644
--- a/modules/codec/avcodec/encoder.c
+++ b/modules/codec/avcodec/encoder.c
@@ -822,16 +822,41 @@ int OpenEncoder( vlc_object_t *p_this )
av_dict_free(&options);
- p_enc->fmt_out.i_extra = p_context->extradata_size;
- if( p_enc->fmt_out.i_extra )
+ if( i_codec_id == AV_CODEC_ID_FLAC )
{
+ p_enc->fmt_out.i_extra = 4 + 1 + 3 + p_context->extradata_size;
p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
- if ( p_enc->fmt_out.p_extra == NULL )
+ if( p_enc->fmt_out.p_extra )
{
- goto error;
+ uint8_t *p = p_enc->fmt_out.p_extra;
+ p[0] = 0x66; /* f */
+ p[1] = 0x4C; /* L */
+ p[2] = 0x61; /* a */
+ p[3] = 0x43; /* C */
+ p[4] = 0x80; /* streaminfo block, last block before audio */
+ p[5] = ( p_context->extradata_size >> 16 ) & 0xff;
+ p[6] = ( p_context->extradata_size >> 8 ) & 0xff;
+ p[7] = ( p_context->extradata_size ) & 0xff;
+ memcpy( &p[8], p_context->extradata, p_context->extradata_size );
+ }
+ else
+ {
+ p_enc->fmt_out.i_extra = 0;
+ }
+ }
+ else
+ {
+ p_enc->fmt_out.i_extra = p_context->extradata_size;
+ if( p_enc->fmt_out.i_extra )
+ {
+ p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra );
+ if ( p_enc->fmt_out.p_extra == NULL )
+ {
+ goto error;
+ }
+ memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
+ p_enc->fmt_out.i_extra );
}
- memcpy( p_enc->fmt_out.p_extra, p_context->extradata,
- p_enc->fmt_out.i_extra );
}
p_context->flags &= ~CODEC_FLAG_GLOBAL_HEADER;
diff --git a/modules/codec/flac.c b/modules/codec/flac.c
index b57c3a4..72a12bc 100644
--- a/modules/codec/flac.c
+++ b/modules/codec/flac.c
@@ -584,9 +584,12 @@ EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
msg_Dbg( p_enc, "Writing STREAMINFO: %zu", bytes );
/* Backup the STREAMINFO metadata block */
- p_enc->fmt_out.i_extra = STREAMINFO_SIZE;
- p_enc->fmt_out.p_extra = xmalloc( STREAMINFO_SIZE );
- memcpy(p_enc->fmt_out.p_extra, buffer + 4, STREAMINFO_SIZE );
+ p_enc->fmt_out.i_extra = STREAMINFO_SIZE + 8;
+ p_enc->fmt_out.p_extra = xmalloc( STREAMINFO_SIZE + 8);
+ memcpy(p_enc->fmt_out.p_extra, "fLaC", 4);
+ memcpy(p_enc->fmt_out.p_extra + 4, buffer, STREAMINFO_SIZE );
+ /* Fake this as the last metadata block */
+ ((uint8_t*)p_enc->fmt_out.p_extra)[4] |= 0x80;
}
p_sys->i_headers++;
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
More information about the vlc-commits
mailing list