Mercurial > libavformat.hg
diff flacenc.c @ 4578:c05d167a4fe2 libavformat
Use a shared function to validate FLAC extradata.
author | jbr |
---|---|
date | Thu, 26 Feb 2009 02:29:24 +0000 |
parents | 1cc2041c2e03 |
children | e5fca5c56cb2 |
line wrap: on
line diff
--- a/flacenc.c Thu Feb 26 02:21:43 2009 +0000 +++ b/flacenc.c Thu Feb 26 02:29:24 2009 +0000 @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavcodec/flac.h" #include "avformat.h" static int flac_write_header(struct AVFormatContext *s) @@ -26,9 +27,15 @@ static const uint8_t header[8] = { 0x66, 0x4C, 0x61, 0x43, 0x80, 0x00, 0x00, 0x22 }; - uint8_t *streaminfo = s->streams[0]->codec->extradata; + AVCodecContext *codec = s->streams[0]->codec; + uint8_t *streaminfo; int len = s->streams[0]->codec->extradata_size; - if(streaminfo != NULL && len > 0) { + enum FLACExtradataFormat format; + + if (!ff_flac_is_extradata_valid(codec, &format, &streaminfo)) + return -1; + + if (format == FLAC_EXTRADATA_FORMAT_STREAMINFO) { put_buffer(s->pb, header, 8); put_buffer(s->pb, streaminfo, len); } @@ -38,16 +45,22 @@ static int flac_write_trailer(struct AVFormatContext *s) { ByteIOContext *pb = s->pb; - uint8_t *streaminfo = s->streams[0]->codec->extradata; - int len = s->streams[0]->codec->extradata_size; + uint8_t *streaminfo; + enum FLACExtradataFormat format; int64_t file_size; - if (streaminfo && len > 0 && !url_is_streamed(s->pb)) { + if (!ff_flac_is_extradata_valid(s->streams[0]->codec, &format, &streaminfo)) + return -1; + + if (!url_is_streamed(pb)) { + /* rewrite the STREAMINFO header block data */ file_size = url_ftell(pb); url_fseek(pb, 8, SEEK_SET); - put_buffer(pb, streaminfo, len); + put_buffer(pb, streaminfo, FLAC_STREAMINFO_SIZE); url_fseek(pb, file_size, SEEK_SET); put_flush_packet(pb); + } else { + av_log(s, AV_LOG_WARNING, "unable to rewrite FLAC header.\n"); } return 0; }