2 * Sony OpenMG (OMA) demuxer
4 * Copyright (c) 2008 Maxim Poliakovski
5 * 2008 Benjamin Larsson
7 * This file is part of FFmpeg.
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 * This is a demuxer for Sony OpenMG Music files
28 * Known file extensions: ".oma", "aa3"
29 * The format of such files consists of three parts:
30 * - "ea3" header carrying overall info and metadata.
31 * - "EA3" header is a Sony-specific header containing information about
32 * the OpenMG file: codec type (usually ATRAC, can also be MP3 or WMA),
33 * codec specific info (packet size, sample rate, channels and so on)
34 * and DRM related info (file encryption, content id).
35 * - Sound data organized in packets follow the EA3 header
36 * (can be encrypted using the Sony DRM!).
38 * LIMITATIONS: This version supports only plain (unencrypted) OMA files.
39 * If any DRM-protected (encrypted) file is encountered you will get the
40 * corresponding error message. Try to remove the encryption using any
41 * Sony software (for example SonicStage).
42 * CODEC SUPPORT: Only ATRAC3 codec is currently supported!
46 #include "libavutil/intreadwrite.h"
50 #define EA3_HEADER_SIZE 96
53 OMA_CODECID_ATRAC3
= 0,
54 OMA_CODECID_ATRAC3P
= 1,
60 static const AVCodecTag codec_oma_tags
[] = {
61 { CODEC_ID_ATRAC3
, OMA_CODECID_ATRAC3
},
62 { CODEC_ID_ATRAC3P
, OMA_CODECID_ATRAC3P
},
63 { CODEC_ID_MP3
, OMA_CODECID_MP3
},
66 static int oma_read_header(AVFormatContext
*s
,
67 AVFormatParameters
*ap
)
69 static const uint16_t srate_tab
[6] = {320,441,480,882,960,0};
70 int ret
, ea3_taglen
, EA3_pos
, framesize
, jsflag
, samplerate
, channel_id
;
71 uint32_t codec_params
;
73 uint8_t buf
[EA3_HEADER_SIZE
];
77 ret
= get_buffer(s
->pb
, buf
, 10);
81 ea3_taglen
= ((buf
[6] & 0x7f) << 21) | ((buf
[7] & 0x7f) << 14) | ((buf
[8] & 0x7f) << 7) | (buf
[9] & 0x7f);
83 EA3_pos
= ea3_taglen
+ 10;
87 url_fseek(s
->pb
, EA3_pos
, SEEK_SET
);
88 ret
= get_buffer(s
->pb
, buf
, EA3_HEADER_SIZE
);
89 if (ret
!= EA3_HEADER_SIZE
)
92 if (memcmp(buf
, (uint8_t[]){'E', 'A', '3'},3) || buf
[4] != 0 || buf
[5] != EA3_HEADER_SIZE
) {
93 av_log(s
, AV_LOG_ERROR
, "Couldn't find the EA3 header !\n");
97 eid
= AV_RB16(&buf
[6]);
98 if (eid
!= -1 && eid
!= -128) {
99 av_log(s
, AV_LOG_ERROR
, "Encrypted file! Eid: %d\n", eid
);
103 codec_params
= AV_RB24(&buf
[33]);
104 channel_id
= (codec_params
>> 10) & 7;
105 samplerate
= srate_tab
[(codec_params
>> 13) & 7]*100;
107 st
= av_new_stream(s
, 0);
109 return AVERROR(ENOMEM
);
112 case OMA_CODECID_ATRAC3
:
113 if (samplerate
!= 44100)
114 av_log(s
, AV_LOG_ERROR
, "Unsupported sample rate, send sample file to developers: %d\n", samplerate
);
116 framesize
= (codec_params
& 0x3FF) * 8;
117 jsflag
= (codec_params
>> 17) & 1; /* get stereo coding mode, 1 for joint-stereo */
120 /* fake the atrac3 extradata (wav format, makes stream copy to wav work) */
121 st
->codec
->extradata_size
= 14;
122 edata
= av_mallocz(14 + FF_INPUT_BUFFER_PADDING_SIZE
);
124 return AVERROR(ENOMEM
);
126 st
->codec
->extradata
= edata
;
127 AV_WL16(&edata
[0], 1); // always 1
128 AV_WL32(&edata
[2], samplerate
); // samples rate
129 AV_WL16(&edata
[6], jsflag
); // coding mode
130 AV_WL16(&edata
[8], jsflag
); // coding mode
131 AV_WL16(&edata
[10], 1); // always 1
132 // AV_WL16(&edata[12], 0); // always 0
134 case OMA_CODECID_ATRAC3P
:
135 framesize
= ((codec_params
& 0x3FF) * 8) + 8;
136 av_log(s
, AV_LOG_ERROR
, "Unsupported codec ATRAC3+!\n");
139 av_log(s
, AV_LOG_ERROR
, "Unsupported codec %d!\n",buf
[32]);
144 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
145 st
->codec
->codec_tag
= buf
[32];
146 st
->codec
->codec_id
= codec_get_id(codec_oma_tags
, st
->codec
->codec_tag
);
147 st
->codec
->channels
= channel_id
;
148 st
->codec
->sample_rate
= samplerate
;
149 st
->codec
->bit_rate
= samplerate
* framesize
* 8 / 1024;
150 st
->codec
->block_align
= framesize
;
153 av_set_pts_info(st
, 64, 1, st
->codec
->sample_rate
);
155 url_fseek(s
->pb
, EA3_pos
+ EA3_HEADER_SIZE
, SEEK_SET
);
161 static int oma_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
163 int ret
= av_get_packet(s
->pb
, pkt
, s
->streams
[0]->codec
->block_align
);
165 pkt
->stream_index
= 0;
172 static int oma_read_probe(AVProbeData
*p
)
174 if (!memcmp(p
->buf
, (uint8_t[]){'e', 'a', '3', 3, 0},5))
175 return AVPROBE_SCORE_MAX
;
181 AVInputFormat oma_demuxer
= {
183 NULL_IF_CONFIG_SMALL("Sony OpenMG audio"),
190 .flags
= AVFMT_GENERIC_INDEX
,
191 .extensions
= "oma,aa3",
192 .codec_tag
= (const AVCodecTag
*[]){codec_oma_tags
, 0},