static av_cold int flac_decode_init(AVCodecContext *avctx) { enum FLACExtradataFormat format; uint8_t *streaminfo; FLACContext *s = avctx->priv_data; s->avctx = avctx; avctx->sample_fmt = AV_SAMPLE_FMT_S16; /* for now, the raw FLAC header is allowed to be passed to the decoder as frame data instead of extradata. */ if (!avctx->extradata) return 0; if (!ff_flac_is_extradata_valid(avctx, &format, &streaminfo)) return -1; /* initialize based on the demuxer-supplied streamdata header */ ff_flac_parse_streaminfo(avctx, (FLACStreaminfo *)s, streaminfo); if (s->bps > 16) avctx->sample_fmt = AV_SAMPLE_FMT_S32; else avctx->sample_fmt = AV_SAMPLE_FMT_S16; allocate_buffers(s); s->got_streaminfo = 1; return 0; }
static av_cold int flac_decode_init(AVCodecContext *avctx) { enum FLACExtradataFormat format; uint8_t *streaminfo; int ret; FLACContext *s = avctx->priv_data; s->avctx = avctx; /* for now, the raw FLAC header is allowed to be passed to the decoder as frame data instead of extradata. */ if (!avctx->extradata) return 0; if (!ff_flac_is_extradata_valid(avctx, &format, &streaminfo)) return AVERROR_INVALIDDATA; /* initialize based on the demuxer-supplied streamdata header */ ff_flac_parse_streaminfo(avctx, (FLACStreaminfo *)s, streaminfo); ret = allocate_buffers(s); if (ret < 0) return ret; flac_set_bps(s); ff_flacdsp_init(&s->dsp, avctx->sample_fmt, s->bps); s->got_streaminfo = 1; return 0; }
static int flac_write_trailer(struct AVFormatContext *s) { ByteIOContext *pb = s->pb; uint8_t *streaminfo; enum FLACExtradataFormat format; int64_t file_size; 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, 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; }
static int flac_write_trailer(struct AVFormatContext *s) { AVIOContext *pb = s->pb; uint8_t *streaminfo; enum FLACExtradataFormat format; int64_t file_size; if (!ff_flac_is_extradata_valid(s->streams[0]->codec, &format, &streaminfo)) return -1; if (pb->seekable) { /* rewrite the STREAMINFO header block data */ file_size = avio_tell(pb); avio_seek(pb, 8, SEEK_SET); avio_write(pb, streaminfo, FLAC_STREAMINFO_SIZE); avio_seek(pb, file_size, SEEK_SET); avio_flush(pb); } else { av_log(s, AV_LOG_WARNING, "unable to rewrite FLAC header.\n"); } return 0; }
int ff_flac_write_header(ByteIOContext *pb, AVCodecContext *codec, int last_block) { uint8_t header[8] = { 0x66, 0x4C, 0x61, 0x43, 0x00, 0x00, 0x00, 0x22 }; uint8_t *streaminfo; enum FLACExtradataFormat format; header[4] = last_block ? 0x80 : 0x00; if (!ff_flac_is_extradata_valid(codec, &format, &streaminfo)) return -1; /* write "fLaC" stream marker and first metadata block header if needed */ if (format == FLAC_EXTRADATA_FORMAT_STREAMINFO) { put_buffer(pb, header, 8); } /* write STREAMINFO or full header */ put_buffer(pb, codec->extradata, codec->extradata_size); return 0; }
static int ogg_build_flac_headers(AVCodecContext *avctx, OGGStreamContext *oggstream, int bitexact) { enum FLACExtradataFormat format; uint8_t *streaminfo; uint8_t *p; if (!ff_flac_is_extradata_valid(avctx, &format, &streaminfo)) return -1; // first packet: STREAMINFO oggstream->header_len[0] = 51; oggstream->header[0] = av_mallocz(51); // per ogg flac specs p = oggstream->header[0]; if (!p) return AVERROR_NOMEM; bytestream_put_byte(&p, 0x7F); bytestream_put_buffer(&p, "FLAC", 4); bytestream_put_byte(&p, 1); // major version bytestream_put_byte(&p, 0); // minor version bytestream_put_be16(&p, 1); // headers packets without this one bytestream_put_buffer(&p, "fLaC", 4); bytestream_put_byte(&p, 0x00); // streaminfo bytestream_put_be24(&p, 34); bytestream_put_buffer(&p, streaminfo, FLAC_STREAMINFO_SIZE); // second packet: VorbisComment p = ogg_write_vorbiscomment(4, bitexact, &oggstream->header_len[1]); if (!p) return AVERROR_NOMEM; oggstream->header[1] = p; bytestream_put_byte(&p, 0x84); // last metadata block and vorbis comment bytestream_put_be24(&p, oggstream->header_len[1] - 4); return 0; }