/* * Copyright (c) 2012 Justin Ruggles * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/** * @file * Vorbis audio parser * * Determines the duration for each packet.
*/
staticint parse_id_header(AVVorbisParseContext *s, const uint8_t *buf, int buf_size)
{ /* Id header should be 30 bytes */ if (buf_size < 30) {
av_log(s, AV_LOG_ERROR, "Id header is too short\n"); return AVERROR_INVALIDDATA;
}
/* make sure this is the Id header */ if (buf[0] != 1) {
av_log(s, AV_LOG_ERROR, "Wrong packet type in Id header\n"); return AVERROR_INVALIDDATA;
}
/* check for header signature */ if (memcmp(&buf[1], "vorbis", 6)) {
av_log(s, AV_LOG_ERROR, "Invalid packet signature in Id header\n"); return AVERROR_INVALIDDATA;
}
if (!(buf[29] & 0x1)) {
av_log(s, AV_LOG_ERROR, "Invalid framing bit in Id header\n"); return AVERROR_INVALIDDATA;
}
staticint parse_setup_header(AVVorbisParseContext *s, const uint8_t *buf, int buf_size)
{
GetBitContext gb, gb0;
uint8_t *rev_buf; int i, ret = 0; int got_framing_bit, mode_count, got_mode_header, last_mode_count = 0;
/* avoid overread */ if (buf_size < 7) {
av_log(s, AV_LOG_ERROR, "Setup header is too short\n"); return AVERROR_INVALIDDATA;
}
/* make sure this is the Setup header */ if (buf[0] != 5) {
av_log(s, AV_LOG_ERROR, "Wrong packet type in Setup header\n"); return AVERROR_INVALIDDATA;
}
/* check for header signature */ if (memcmp(&buf[1], "vorbis", 6)) {
av_log(s, AV_LOG_ERROR, "Invalid packet signature in Setup header\n"); return AVERROR_INVALIDDATA;
}
/* reverse bytes so we can easily read backwards with get_bits() */ if (!(rev_buf = av_malloc(buf_size))) {
av_log(s, AV_LOG_ERROR, "Out of memory\n"); return AVERROR(ENOMEM);
} for (i = 0; i < buf_size; i++)
rev_buf[i] = buf[buf_size - 1 - i];
init_get_bits(&gb, rev_buf, buf_size * 8);
got_framing_bit = 0; while (get_bits_left(&gb) > 97) { if (get_bits1(&gb)) {
got_framing_bit = get_bits_count(&gb); break;
}
} if (!got_framing_bit) {
av_log(s, AV_LOG_ERROR, "Invalid Setup header\n");
ret = AVERROR_INVALIDDATA; goto bad_header;
}
/* Now we search backwards to find possible valid mode counts. This is not * fool-proof because we could have false positive matches and read too * far, but there isn't really any way to be sure without parsing through * all the many variable-sized fields before the modes. This approach seems * to work well in testing, and it is similar to how it is handled in
* liboggz. */
mode_count = 0;
got_mode_header = 0; while (get_bits_left(&gb) >= 97) { if (get_bits(&gb, 8) > 63 || get_bits(&gb, 16) || get_bits(&gb, 16)) break;
skip_bits(&gb, 1);
mode_count++; if (mode_count > 64) break;
gb0 = gb; if (get_bits(&gb0, 6) + 1 == mode_count) {
got_mode_header = 1;
last_mode_count = mode_count;
}
} if (!got_mode_header) {
av_log(s, AV_LOG_ERROR, "Invalid Setup header\n");
ret = AVERROR_INVALIDDATA; goto bad_header;
} /* All samples I've seen use <= 2 modes, so ask for a sample if we find * more than that, as it is most likely a false positive. If we get any * we may need to approach this the long way and parse the whole Setup
* header, but I hope very much that it never comes to that. */ if (last_mode_count > 2) {
avpriv_request_sample(s, "%d modes (either a false positive or a " "sample from an unknown encoder)",
last_mode_count);
} /* We're limiting the mode count to 63 so that we know that the previous
* block flag will be in the first packet byte. */ if (last_mode_count > 63) {
av_log(s, AV_LOG_ERROR, "Unsupported mode count: %d\n",
last_mode_count);
ret = AVERROR_INVALIDDATA; goto bad_header;
}
s->mode_count = mode_count = last_mode_count; /* Determine the number of bits required to code the mode and turn that
* into a bitmask to directly access the mode from the first frame byte. */
s->mode_mask = ((1 << (av_log2(mode_count - 1) + 1)) - 1) << 1; /* The previous window flag is the next bit after the mode */
s->prev_mask = (s->mode_mask | 0x1) + 1;
init_get_bits(&gb, rev_buf, buf_size * 8);
skip_bits_long(&gb, got_framing_bit); for (i = mode_count - 1; i >= 0; i--) {
skip_bits_long(&gb, 40);
s->mode_blocksize[i] = get_bits1(&gb);
}
bad_header:
av_free(rev_buf); return ret;
}
staticint vorbis_parse_init(AVVorbisParseContext *s, const uint8_t *extradata, int extradata_size)
{ const uint8_t *header_start[3]; int header_len[3]; int ret;
int av_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf, int buf_size, int *flags)
{ int duration = 0;
if (s->valid_extradata && buf_size > 0) { int mode, current_blocksize; int previous_blocksize = s->previous_blocksize;
if (buf[0] & 1) { /* If the user doesn't care about special packets, it's a bad one. */ if (!flags) goto bad_packet;
/* Set the flag for which kind of special packet it is. */ if (buf[0] == 1)
*flags |= VORBIS_FLAG_HEADER; elseif (buf[0] == 3)
*flags |= VORBIS_FLAG_COMMENT; elseif (buf[0] == 5)
*flags |= VORBIS_FLAG_SETUP; else
av_log(s, AV_LOG_VERBOSE, "Ignoring packet with unknown type %u\n",
buf[0]);
end: /* always return the full packet. this parser isn't doing any splitting or
combining, only packet analysis */
*poutbuf = buf;
*poutbuf_size = buf_size; return buf_size;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.