PageRenderTime 43ms CodeModel.GetById 11ms app.highlight 27ms RepoModel.GetById 1ms app.codeStats 0ms

/libavformat/flacdec.c

http://github.com/FFmpeg/FFmpeg
C | 347 lines | 276 code | 33 blank | 38 comment | 83 complexity | 8a2731e5adbc332d948d95bf98ce1d90 MD5 | raw file
  1/*
  2 * Raw FLAC demuxer
  3 * Copyright (c) 2001 Fabrice Bellard
  4 *
  5 * This file is part of FFmpeg.
  6 *
  7 * FFmpeg is free software; you can redistribute it and/or
  8 * modify it under the terms of the GNU Lesser General Public
  9 * License as published by the Free Software Foundation; either
 10 * version 2.1 of the License, or (at your option) any later version.
 11 *
 12 * FFmpeg is distributed in the hope that it will be useful,
 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 15 * Lesser General Public License for more details.
 16 *
 17 * You should have received a copy of the GNU Lesser General Public
 18 * License along with FFmpeg; if not, write to the Free Software
 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 20 */
 21
 22#include "libavcodec/flac.h"
 23#include "avformat.h"
 24#include "flac_picture.h"
 25#include "internal.h"
 26#include "rawdec.h"
 27#include "oggdec.h"
 28#include "vorbiscomment.h"
 29#include "replaygain.h"
 30
 31#define SEEKPOINT_SIZE 18
 32
 33typedef struct FLACDecContext {
 34    AVClass *class;
 35    int raw_packet_size;
 36    int found_seektable;
 37} FLACDecContext;
 38
 39static void reset_index_position(int64_t metadata_head_size, AVStream *st)
 40{
 41    /* the real seek index offset should be the size of metadata blocks with the offset in the frame blocks */
 42    int i;
 43    for(i=0; i<st->nb_index_entries; i++) {
 44        st->index_entries[i].pos += metadata_head_size;
 45    }
 46}
 47
 48static int flac_read_header(AVFormatContext *s)
 49{
 50    int ret, metadata_last=0, metadata_type, metadata_size, found_streaminfo=0;
 51    uint8_t header[4];
 52    uint8_t *buffer=NULL;
 53    FLACDecContext *flac = s->priv_data;
 54    AVStream *st = avformat_new_stream(s, NULL);
 55    if (!st)
 56        return AVERROR(ENOMEM);
 57    st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
 58    st->codecpar->codec_id = AV_CODEC_ID_FLAC;
 59    st->need_parsing = AVSTREAM_PARSE_FULL_RAW;
 60    /* the parameters will be extracted from the compressed bitstream */
 61
 62    /* if fLaC marker is not found, assume there is no header */
 63    if (avio_rl32(s->pb) != MKTAG('f','L','a','C')) {
 64        avio_seek(s->pb, -4, SEEK_CUR);
 65        return 0;
 66    }
 67
 68    /* process metadata blocks */
 69    while (!avio_feof(s->pb) && !metadata_last) {
 70        if (avio_read(s->pb, header, 4) != 4)
 71            return AVERROR(AVERROR_INVALIDDATA);
 72        flac_parse_block_header(header, &metadata_last, &metadata_type,
 73                                   &metadata_size);
 74        switch (metadata_type) {
 75        /* allocate and read metadata block for supported types */
 76        case FLAC_METADATA_TYPE_STREAMINFO:
 77        case FLAC_METADATA_TYPE_CUESHEET:
 78        case FLAC_METADATA_TYPE_PICTURE:
 79        case FLAC_METADATA_TYPE_VORBIS_COMMENT:
 80        case FLAC_METADATA_TYPE_SEEKTABLE:
 81            buffer = av_mallocz(metadata_size + AV_INPUT_BUFFER_PADDING_SIZE);
 82            if (!buffer) {
 83                return AVERROR(ENOMEM);
 84            }
 85            if (avio_read(s->pb, buffer, metadata_size) != metadata_size) {
 86                RETURN_ERROR(AVERROR(EIO));
 87            }
 88            break;
 89        /* skip metadata block for unsupported types */
 90        default:
 91            ret = avio_skip(s->pb, metadata_size);
 92            if (ret < 0)
 93                return ret;
 94        }
 95
 96        if (metadata_type == FLAC_METADATA_TYPE_STREAMINFO) {
 97            uint32_t samplerate;
 98            uint64_t samples;
 99
100            /* STREAMINFO can only occur once */
101            if (found_streaminfo) {
102                RETURN_ERROR(AVERROR_INVALIDDATA);
103            }
104            if (metadata_size != FLAC_STREAMINFO_SIZE) {
105                RETURN_ERROR(AVERROR_INVALIDDATA);
106            }
107            found_streaminfo = 1;
108            st->codecpar->extradata      = buffer;
109            st->codecpar->extradata_size = metadata_size;
110            buffer = NULL;
111
112            /* get sample rate and sample count from STREAMINFO header;
113             * other parameters will be extracted by the parser */
114            samplerate = AV_RB24(st->codecpar->extradata + 10) >> 4;
115            samples    = (AV_RB64(st->codecpar->extradata + 13) >> 24) & ((1ULL << 36) - 1);
116
117            /* set time base and duration */
118            if (samplerate > 0) {
119                avpriv_set_pts_info(st, 64, 1, samplerate);
120                if (samples > 0)
121                    st->duration = samples;
122            }
123        } else if (metadata_type == FLAC_METADATA_TYPE_CUESHEET) {
124            uint8_t isrc[13];
125            uint64_t start;
126            const uint8_t *offset;
127            int i, chapters, track, ti;
128            if (metadata_size < 431)
129                RETURN_ERROR(AVERROR_INVALIDDATA);
130            offset = buffer + 395;
131            chapters = bytestream_get_byte(&offset) - 1;
132            if (chapters <= 0)
133                RETURN_ERROR(AVERROR_INVALIDDATA);
134            for (i = 0; i < chapters; i++) {
135                if (offset + 36 - buffer > metadata_size)
136                    RETURN_ERROR(AVERROR_INVALIDDATA);
137                start = bytestream_get_be64(&offset);
138                track = bytestream_get_byte(&offset);
139                bytestream_get_buffer(&offset, isrc, 12);
140                isrc[12] = 0;
141                offset += 14;
142                ti = bytestream_get_byte(&offset);
143                if (ti <= 0) RETURN_ERROR(AVERROR_INVALIDDATA);
144                offset += ti * 12;
145                avpriv_new_chapter(s, track, st->time_base, start, AV_NOPTS_VALUE, isrc);
146            }
147            av_freep(&buffer);
148        } else if (metadata_type == FLAC_METADATA_TYPE_PICTURE) {
149            ret = ff_flac_parse_picture(s, buffer, metadata_size);
150            av_freep(&buffer);
151            if (ret < 0) {
152                av_log(s, AV_LOG_ERROR, "Error parsing attached picture.\n");
153                return ret;
154            }
155        } else if (metadata_type == FLAC_METADATA_TYPE_SEEKTABLE) {
156            const uint8_t *seekpoint = buffer;
157            int i, seek_point_count = metadata_size/SEEKPOINT_SIZE;
158            flac->found_seektable = 1;
159            if ((s->flags&AVFMT_FLAG_FAST_SEEK)) {
160                for(i=0; i<seek_point_count; i++) {
161                    int64_t timestamp = bytestream_get_be64(&seekpoint);
162                    int64_t pos = bytestream_get_be64(&seekpoint);
163                    /* skip number of samples */
164                    bytestream_get_be16(&seekpoint);
165                    av_add_index_entry(st, pos, timestamp, 0, 0, AVINDEX_KEYFRAME);
166                }
167            }
168            av_freep(&buffer);
169        }
170        else {
171
172            /* STREAMINFO must be the first block */
173            if (!found_streaminfo) {
174                RETURN_ERROR(AVERROR_INVALIDDATA);
175            }
176            /* process supported blocks other than STREAMINFO */
177            if (metadata_type == FLAC_METADATA_TYPE_VORBIS_COMMENT) {
178                AVDictionaryEntry *chmask;
179
180                ret = ff_vorbis_comment(s, &s->metadata, buffer, metadata_size, 1);
181                if (ret < 0) {
182                    av_log(s, AV_LOG_WARNING, "error parsing VorbisComment metadata\n");
183                } else if (ret > 0) {
184                    s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
185                }
186
187                /* parse the channels mask if present */
188                chmask = av_dict_get(s->metadata, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", NULL, 0);
189                if (chmask) {
190                    uint64_t mask = strtol(chmask->value, NULL, 0);
191                    if (!mask || mask & ~0x3ffffULL) {
192                        av_log(s, AV_LOG_WARNING,
193                               "Invalid value of WAVEFORMATEXTENSIBLE_CHANNEL_MASK\n");
194                    } else {
195                        st->codecpar->channel_layout = mask;
196                        av_dict_set(&s->metadata, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", NULL, 0);
197                    }
198                }
199            }
200            av_freep(&buffer);
201        }
202    }
203
204    ret = ff_replaygain_export(st, s->metadata);
205    if (ret < 0)
206        return ret;
207
208    reset_index_position(avio_tell(s->pb), st);
209    return 0;
210
211fail:
212    av_free(buffer);
213    return ret;
214}
215
216static int raw_flac_probe(const AVProbeData *p)
217{
218    if ((p->buf[2] & 0xF0) == 0)    // blocksize code invalid
219        return 0;
220    if ((p->buf[2] & 0x0F) == 0x0F) // sample rate code invalid
221        return 0;
222    if ((p->buf[3] & 0xF0) >= FLAC_MAX_CHANNELS + FLAC_CHMODE_MID_SIDE << 4)
223        // channel mode invalid
224        return 0;
225    if ((p->buf[3] & 0x06) == 0x06) // bits per sample code invalid
226        return 0;
227    if ((p->buf[3] & 0x01) == 0x01) // reserved bit set
228        return 0;
229    return AVPROBE_SCORE_EXTENSION / 4 + 1;
230}
231
232static int flac_probe(const AVProbeData *p)
233{
234    if ((AV_RB16(p->buf) & 0xFFFE) == 0xFFF8)
235        return raw_flac_probe(p);
236
237    /* file header + metadata header + checked bytes of streaminfo */
238    if (p->buf_size >= 4 + 4 + 13) {
239        int type           = p->buf[4] & 0x7f;
240        int size           = AV_RB24(p->buf + 5);
241        int min_block_size = AV_RB16(p->buf + 8);
242        int max_block_size = AV_RB16(p->buf + 10);
243        int sample_rate    = AV_RB24(p->buf + 18) >> 4;
244
245        if (memcmp(p->buf, "fLaC", 4))
246            return 0;
247        if (type == FLAC_METADATA_TYPE_STREAMINFO &&
248            size == FLAC_STREAMINFO_SIZE          &&
249            min_block_size >= 16                  &&
250            max_block_size >= min_block_size      &&
251            sample_rate && sample_rate <= 655350)
252            return AVPROBE_SCORE_MAX;
253        return AVPROBE_SCORE_EXTENSION;
254    }
255
256    return 0;
257}
258
259static av_unused int64_t flac_read_timestamp(AVFormatContext *s, int stream_index,
260                                             int64_t *ppos, int64_t pos_limit)
261{
262    AVPacket pkt;
263    AVStream *st = s->streams[stream_index];
264    AVCodecParserContext *parser;
265    int ret;
266    int64_t pts = AV_NOPTS_VALUE;
267
268    if (avio_seek(s->pb, *ppos, SEEK_SET) < 0)
269        return AV_NOPTS_VALUE;
270
271    av_init_packet(&pkt);
272    parser = av_parser_init(st->codecpar->codec_id);
273    if (!parser){
274        return AV_NOPTS_VALUE;
275    }
276    parser->flags |= PARSER_FLAG_USE_CODEC_TS;
277
278    for (;;){
279        uint8_t *data;
280        int size;
281
282        ret = ff_raw_read_partial_packet(s, &pkt);
283        if (ret < 0){
284            if (ret == AVERROR(EAGAIN))
285                continue;
286            else {
287                av_packet_unref(&pkt);
288                av_assert1(!pkt.size);
289            }
290        }
291        av_parser_parse2(parser, st->internal->avctx,
292                         &data, &size, pkt.data, pkt.size,
293                         pkt.pts, pkt.dts, *ppos);
294
295        av_packet_unref(&pkt);
296        if (size) {
297            if (parser->pts != AV_NOPTS_VALUE){
298                // seeking may not have started from beginning of a frame
299                // calculate frame start position from next frame backwards
300                *ppos = parser->next_frame_offset - size;
301                pts = parser->pts;
302                break;
303            }
304        } else if (ret < 0)
305            break;
306    }
307    av_parser_close(parser);
308    return pts;
309}
310
311static int flac_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) {
312    int index;
313    int64_t pos;
314    AVIndexEntry e;
315    FLACDecContext *flac = s->priv_data;
316
317    if (!flac->found_seektable || !(s->flags&AVFMT_FLAG_FAST_SEEK)) {
318        return -1;
319    }
320
321    index = av_index_search_timestamp(s->streams[0], timestamp, flags);
322    if(index<0 || index >= s->streams[0]->nb_index_entries)
323        return -1;
324
325    e = s->streams[0]->index_entries[index];
326    pos = avio_seek(s->pb, e.pos, SEEK_SET);
327    if (pos >= 0) {
328        return 0;
329    }
330    return -1;
331}
332
333FF_RAW_DEMUXER_CLASS(flac)
334AVInputFormat ff_flac_demuxer = {
335    .name           = "flac",
336    .long_name      = NULL_IF_CONFIG_SMALL("raw FLAC"),
337    .read_probe     = flac_probe,
338    .read_header    = flac_read_header,
339    .read_packet    = ff_raw_read_partial_packet,
340    .read_seek      = flac_seek,
341    .read_timestamp = flac_read_timestamp,
342    .flags          = AVFMT_GENERIC_INDEX,
343    .extensions     = "flac",
344    .raw_codec_id   = AV_CODEC_ID_FLAC,
345    .priv_data_size = sizeof(FLACDecContext),
346    .priv_class     = &flac_demuxer_class,
347};