| OLD | NEW |
| 1 /* | 1 /* |
| 2 * MP3 muxer and demuxer | 2 * MP3 muxer and demuxer |
| 3 * Copyright (c) 2003 Fabrice Bellard | 3 * Copyright (c) 2003 Fabrice Bellard |
| 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 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 | 188 |
| 189 AVInputFormat mp3_demuxer = { | 189 AVInputFormat mp3_demuxer = { |
| 190 "mp3", | 190 "mp3", |
| 191 NULL_IF_CONFIG_SMALL("MPEG audio layer 2/3"), | 191 NULL_IF_CONFIG_SMALL("MPEG audio layer 2/3"), |
| 192 0, | 192 0, |
| 193 mp3_read_probe, | 193 mp3_read_probe, |
| 194 mp3_read_header, | 194 mp3_read_header, |
| 195 mp3_read_packet, | 195 mp3_read_packet, |
| 196 .flags= AVFMT_GENERIC_INDEX, | 196 .flags= AVFMT_GENERIC_INDEX, |
| 197 .extensions = "mp2,mp3,m2a", /* XXX: use probe */ | 197 .extensions = "mp2,mp3,m2a", /* XXX: use probe */ |
| 198 .metadata_conv = ff_id3v2_metadata_conv, | |
| 199 }; | 198 }; |
| 200 #endif | 199 #endif |
| 201 | 200 |
| 202 #if CONFIG_MP2_MUXER || CONFIG_MP3_MUXER | 201 #if CONFIG_MP2_MUXER || CONFIG_MP3_MUXER |
| 203 static int id3v1_set_string(AVFormatContext *s, const char *key, | 202 static int id3v1_set_string(AVFormatContext *s, const char *key, |
| 204 uint8_t *buf, int buf_size) | 203 uint8_t *buf, int buf_size) |
| 205 { | 204 { |
| 206 AVMetadataTag *tag; | 205 AVMetadataTag *tag; |
| 207 if ((tag = av_metadata_get(s->metadata, key, NULL, 0))) | 206 if ((tag = av_metadata_get(s->metadata, key, NULL, 0))) |
| 208 strncpy(buf, tag->value, buf_size); | 207 strncpy(buf, tag->value, buf_size); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 "mp2", | 286 "mp2", |
| 288 NULL_IF_CONFIG_SMALL("MPEG audio layer 2"), | 287 NULL_IF_CONFIG_SMALL("MPEG audio layer 2"), |
| 289 "audio/x-mpeg", | 288 "audio/x-mpeg", |
| 290 "mp2,m2a", | 289 "mp2,m2a", |
| 291 0, | 290 0, |
| 292 CODEC_ID_MP2, | 291 CODEC_ID_MP2, |
| 293 CODEC_ID_NONE, | 292 CODEC_ID_NONE, |
| 294 NULL, | 293 NULL, |
| 295 mp3_write_packet, | 294 mp3_write_packet, |
| 296 mp3_write_trailer, | 295 mp3_write_trailer, |
| 297 .metadata_conv = ff_id3v2_metadata_conv, | |
| 298 }; | 296 }; |
| 299 #endif | 297 #endif |
| 300 | 298 |
| 301 #if CONFIG_MP3_MUXER | 299 #if CONFIG_MP3_MUXER |
| 302 /** | 300 /** |
| 303 * Write an ID3v2.4 header at beginning of stream | 301 * Write an ID3v2.4 header at beginning of stream |
| 304 */ | 302 */ |
| 305 | 303 |
| 306 static int mp3_write_header(struct AVFormatContext *s) | 304 static int mp3_write_header(struct AVFormatContext *s) |
| 307 { | 305 { |
| 308 AVMetadataTag *t = NULL; | 306 AVMetadataTag *t = NULL; |
| 309 int totlen = 0; | 307 int totlen = 0; |
| 310 int64_t size_pos, cur_pos; | 308 int64_t size_pos, cur_pos; |
| 311 | 309 |
| 312 put_be32(s->pb, MKBETAG('I', 'D', '3', 0x04)); /* ID3v2.4 */ | 310 put_be32(s->pb, MKBETAG('I', 'D', '3', 0x04)); /* ID3v2.4 */ |
| 313 put_byte(s->pb, 0); | 311 put_byte(s->pb, 0); |
| 314 put_byte(s->pb, 0); /* flags */ | 312 put_byte(s->pb, 0); /* flags */ |
| 315 | 313 |
| 316 /* reserve space for size */ | 314 /* reserve space for size */ |
| 317 size_pos = url_ftell(s->pb); | 315 size_pos = url_ftell(s->pb); |
| 318 put_be32(s->pb, 0); | 316 put_be32(s->pb, 0); |
| 319 | 317 |
| 318 ff_metadata_conv(&s->metadata, ff_id3v2_metadata_conv, NULL); |
| 320 while ((t = av_metadata_get(s->metadata, "", t, AV_METADATA_IGNORE_SUFFIX)))
{ | 319 while ((t = av_metadata_get(s->metadata, "", t, AV_METADATA_IGNORE_SUFFIX)))
{ |
| 321 uint32_t tag = 0; | 320 uint32_t tag = 0; |
| 322 | 321 |
| 323 if (t->key[0] == 'T' && strlen(t->key) == 4) { | 322 if (t->key[0] == 'T' && strlen(t->key) == 4) { |
| 324 int i; | 323 int i; |
| 325 for (i = 0; *ff_id3v2_tags[i]; i++) | 324 for (i = 0; *ff_id3v2_tags[i]; i++) |
| 326 if (AV_RB32(t->key) == AV_RB32(ff_id3v2_tags[i])) { | 325 if (AV_RB32(t->key) == AV_RB32(ff_id3v2_tags[i])) { |
| 327 int len = strlen(t->value); | 326 int len = strlen(t->value); |
| 328 tag = AV_RB32(t->key); | 327 tag = AV_RB32(t->key); |
| 329 totlen += len + ID3v2_HEADER_SIZE + 2; | 328 totlen += len + ID3v2_HEADER_SIZE + 2; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 359 NULL_IF_CONFIG_SMALL("MPEG audio layer 3"), | 358 NULL_IF_CONFIG_SMALL("MPEG audio layer 3"), |
| 360 "audio/x-mpeg", | 359 "audio/x-mpeg", |
| 361 "mp3", | 360 "mp3", |
| 362 0, | 361 0, |
| 363 CODEC_ID_MP3, | 362 CODEC_ID_MP3, |
| 364 CODEC_ID_NONE, | 363 CODEC_ID_NONE, |
| 365 mp3_write_header, | 364 mp3_write_header, |
| 366 mp3_write_packet, | 365 mp3_write_packet, |
| 367 mp3_write_trailer, | 366 mp3_write_trailer, |
| 368 AVFMT_NOTIMESTAMPS, | 367 AVFMT_NOTIMESTAMPS, |
| 369 .metadata_conv = ff_id3v2_metadata_conv, | |
| 370 }; | 368 }; |
| 371 #endif | 369 #endif |
| OLD | NEW |