| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Ogg muxer | 2 * Ogg muxer |
| 3 * Copyright (c) 2007 Baptiste Coudurier <baptiste dot coudurier at free dot fr> | 3 * Copyright (c) 2007 Baptiste Coudurier <baptiste dot coudurier at free dot fr> |
| 4 * | 4 * |
| 5 * This file is part of FFmpeg. | 5 * This file is part of FFmpeg. |
| 6 * | 6 * |
| 7 * FFmpeg is free software; you can redistribute it and/or | 7 * FFmpeg is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Lesser General Public | 8 * modify it under the terms of the GNU Lesser General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2.1 of the License, or (at your option) any later version. | 10 * version 2.1 of the License, or (at your option) any later version. |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 page->granule = granule; | 199 page->granule = granule; |
| 200 | 200 |
| 201 if (page->segments_count == 255) { | 201 if (page->segments_count == 255) { |
| 202 ogg_buffer_page(s, oggstream); | 202 ogg_buffer_page(s, oggstream); |
| 203 } | 203 } |
| 204 } | 204 } |
| 205 return 0; | 205 return 0; |
| 206 } | 206 } |
| 207 | 207 |
| 208 static uint8_t *ogg_write_vorbiscomment(int offset, int bitexact, | 208 static uint8_t *ogg_write_vorbiscomment(int offset, int bitexact, |
| 209 int *header_len, AVMetadata *m, int fram
ing_bit) | 209 int *header_len, AVMetadata **m, int fra
ming_bit) |
| 210 { | 210 { |
| 211 const char *vendor = bitexact ? "ffmpeg" : LIBAVFORMAT_IDENT; | 211 const char *vendor = bitexact ? "ffmpeg" : LIBAVFORMAT_IDENT; |
| 212 int size; | 212 int size; |
| 213 uint8_t *p, *p0; | 213 uint8_t *p, *p0; |
| 214 unsigned int count; | 214 unsigned int count; |
| 215 | 215 |
| 216 size = offset + ff_vorbiscomment_length(m, vendor, &count) + framing_bit; | 216 size = offset + ff_vorbiscomment_length(*m, vendor, &count) + framing_bit; |
| 217 p = av_mallocz(size); | 217 p = av_mallocz(size); |
| 218 if (!p) | 218 if (!p) |
| 219 return NULL; | 219 return NULL; |
| 220 p0 = p; | 220 p0 = p; |
| 221 | 221 |
| 222 p += offset; | 222 p += offset; |
| 223 ff_vorbiscomment_write(&p, m, vendor, count); | 223 ff_vorbiscomment_write(&p, m, vendor, count); |
| 224 if (framing_bit) | 224 if (framing_bit) |
| 225 bytestream_put_byte(&p, 1); | 225 bytestream_put_byte(&p, 1); |
| 226 | 226 |
| 227 *header_len = size; | 227 *header_len = size; |
| 228 return p0; | 228 return p0; |
| 229 } | 229 } |
| 230 | 230 |
| 231 static int ogg_build_flac_headers(AVCodecContext *avctx, | 231 static int ogg_build_flac_headers(AVCodecContext *avctx, |
| 232 OGGStreamContext *oggstream, int bitexact, | 232 OGGStreamContext *oggstream, int bitexact, |
| 233 AVMetadata *m) | 233 AVMetadata **m) |
| 234 { | 234 { |
| 235 enum FLACExtradataFormat format; | 235 enum FLACExtradataFormat format; |
| 236 uint8_t *streaminfo; | 236 uint8_t *streaminfo; |
| 237 uint8_t *p; | 237 uint8_t *p; |
| 238 | 238 |
| 239 if (!ff_flac_is_extradata_valid(avctx, &format, &streaminfo)) | 239 if (!ff_flac_is_extradata_valid(avctx, &format, &streaminfo)) |
| 240 return -1; | 240 return -1; |
| 241 | 241 |
| 242 // first packet: STREAMINFO | 242 // first packet: STREAMINFO |
| 243 oggstream->header_len[0] = 51; | 243 oggstream->header_len[0] = 51; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 263 bytestream_put_byte(&p, 0x84); // last metadata block and vorbis comment | 263 bytestream_put_byte(&p, 0x84); // last metadata block and vorbis comment |
| 264 bytestream_put_be24(&p, oggstream->header_len[1] - 4); | 264 bytestream_put_be24(&p, oggstream->header_len[1] - 4); |
| 265 | 265 |
| 266 return 0; | 266 return 0; |
| 267 } | 267 } |
| 268 | 268 |
| 269 #define SPEEX_HEADER_SIZE 80 | 269 #define SPEEX_HEADER_SIZE 80 |
| 270 | 270 |
| 271 static int ogg_build_speex_headers(AVCodecContext *avctx, | 271 static int ogg_build_speex_headers(AVCodecContext *avctx, |
| 272 OGGStreamContext *oggstream, int bitexact, | 272 OGGStreamContext *oggstream, int bitexact, |
| 273 AVMetadata *m) | 273 AVMetadata **m) |
| 274 { | 274 { |
| 275 uint8_t *p; | 275 uint8_t *p; |
| 276 | 276 |
| 277 if (avctx->extradata_size < SPEEX_HEADER_SIZE) | 277 if (avctx->extradata_size < SPEEX_HEADER_SIZE) |
| 278 return -1; | 278 return -1; |
| 279 | 279 |
| 280 // first packet: Speex header | 280 // first packet: Speex header |
| 281 p = av_mallocz(SPEEX_HEADER_SIZE); | 281 p = av_mallocz(SPEEX_HEADER_SIZE); |
| 282 if (!p) | 282 if (!p) |
| 283 return AVERROR(ENOMEM); | 283 return AVERROR(ENOMEM); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 if (serial_num == sc->serial_num) | 331 if (serial_num == sc->serial_num) |
| 332 break; | 332 break; |
| 333 } | 333 } |
| 334 } while (j < i); | 334 } while (j < i); |
| 335 oggstream->serial_num = serial_num; | 335 oggstream->serial_num = serial_num; |
| 336 | 336 |
| 337 st->priv_data = oggstream; | 337 st->priv_data = oggstream; |
| 338 if (st->codec->codec_id == CODEC_ID_FLAC) { | 338 if (st->codec->codec_id == CODEC_ID_FLAC) { |
| 339 int err = ogg_build_flac_headers(st->codec, oggstream, | 339 int err = ogg_build_flac_headers(st->codec, oggstream, |
| 340 st->codec->flags & CODEC_FLAG_BITEX
ACT, | 340 st->codec->flags & CODEC_FLAG_BITEX
ACT, |
| 341 s->metadata); | 341 &s->metadata); |
| 342 if (err) { | 342 if (err) { |
| 343 av_log(s, AV_LOG_ERROR, "Error writing FLAC headers\n"); | 343 av_log(s, AV_LOG_ERROR, "Error writing FLAC headers\n"); |
| 344 av_freep(&st->priv_data); | 344 av_freep(&st->priv_data); |
| 345 return err; | 345 return err; |
| 346 } | 346 } |
| 347 } else if (st->codec->codec_id == CODEC_ID_SPEEX) { | 347 } else if (st->codec->codec_id == CODEC_ID_SPEEX) { |
| 348 int err = ogg_build_speex_headers(st->codec, oggstream, | 348 int err = ogg_build_speex_headers(st->codec, oggstream, |
| 349 st->codec->flags & CODEC_FLAG_BITE
XACT, | 349 st->codec->flags & CODEC_FLAG_BITE
XACT, |
| 350 s->metadata); | 350 &s->metadata); |
| 351 if (err) { | 351 if (err) { |
| 352 av_log(s, AV_LOG_ERROR, "Error writing Speex headers\n"); | 352 av_log(s, AV_LOG_ERROR, "Error writing Speex headers\n"); |
| 353 av_freep(&st->priv_data); | 353 av_freep(&st->priv_data); |
| 354 return err; | 354 return err; |
| 355 } | 355 } |
| 356 } else { | 356 } else { |
| 357 uint8_t *p; | 357 uint8_t *p; |
| 358 char *cstr = st->codec->codec_id == CODEC_ID_VORBIS ? "vorbis" : "th
eora"; | 358 const char *cstr = st->codec->codec_id == CODEC_ID_VORBIS ? "vorbis"
: "theora"; |
| 359 int header_type = st->codec->codec_id == CODEC_ID_VORBIS ? 3 : 0x81; | 359 int header_type = st->codec->codec_id == CODEC_ID_VORBIS ? 3 : 0x81; |
| 360 int framing_bit = st->codec->codec_id == CODEC_ID_VORBIS ? 1 : 0; | 360 int framing_bit = st->codec->codec_id == CODEC_ID_VORBIS ? 1 : 0; |
| 361 | 361 |
| 362 if (ff_split_xiph_headers(st->codec->extradata, st->codec->extradata
_size, | 362 if (ff_split_xiph_headers(st->codec->extradata, st->codec->extradata
_size, |
| 363 st->codec->codec_id == CODEC_ID_VORBIS ? 3
0 : 42, | 363 st->codec->codec_id == CODEC_ID_VORBIS ? 3
0 : 42, |
| 364 oggstream->header, oggstream->header_len)
< 0) { | 364 oggstream->header, oggstream->header_len)
< 0) { |
| 365 av_log(s, AV_LOG_ERROR, "Extradata corrupted\n"); | 365 av_log(s, AV_LOG_ERROR, "Extradata corrupted\n"); |
| 366 av_freep(&st->priv_data); | 366 av_freep(&st->priv_data); |
| 367 return -1; | 367 return -1; |
| 368 } | 368 } |
| 369 | 369 |
| 370 p = ogg_write_vorbiscomment(7, st->codec->flags & CODEC_FLAG_BITEXAC
T, | 370 p = ogg_write_vorbiscomment(7, st->codec->flags & CODEC_FLAG_BITEXAC
T, |
| 371 &oggstream->header_len[1], s->metadata, | 371 &oggstream->header_len[1], &s->metadata, |
| 372 framing_bit); | 372 framing_bit); |
| 373 if (!p) | 373 if (!p) |
| 374 return AVERROR(ENOMEM); | 374 return AVERROR(ENOMEM); |
| 375 | 375 |
| 376 oggstream->header[1] = p; | 376 oggstream->header[1] = p; |
| 377 bytestream_put_byte(&p, header_type); | 377 bytestream_put_byte(&p, header_type); |
| 378 bytestream_put_buffer(&p, cstr, 6); | 378 bytestream_put_buffer(&p, cstr, 6); |
| 379 | 379 |
| 380 if (st->codec->codec_id == CODEC_ID_THEORA) { | 380 if (st->codec->codec_id == CODEC_ID_THEORA) { |
| 381 /** KFGSHIFT is the width of the less significant section of the
granule position | 381 /** KFGSHIFT is the width of the less significant section of the
granule position |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 "ogg", | 488 "ogg", |
| 489 NULL_IF_CONFIG_SMALL("Ogg"), | 489 NULL_IF_CONFIG_SMALL("Ogg"), |
| 490 "application/ogg", | 490 "application/ogg", |
| 491 "ogg,ogv,spx", | 491 "ogg,ogv,spx", |
| 492 sizeof(OGGContext), | 492 sizeof(OGGContext), |
| 493 CODEC_ID_FLAC, | 493 CODEC_ID_FLAC, |
| 494 CODEC_ID_THEORA, | 494 CODEC_ID_THEORA, |
| 495 ogg_write_header, | 495 ogg_write_header, |
| 496 ogg_write_packet, | 496 ogg_write_packet, |
| 497 ogg_write_trailer, | 497 ogg_write_trailer, |
| 498 .metadata_conv = ff_vorbiscomment_metadata_conv, | |
| 499 }; | 498 }; |
| OLD | NEW |