FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
omadec.c
Go to the documentation of this file.
1 /*
2  * Sony OpenMG (OMA) demuxer
3  *
4  * Copyright (c) 2008 Maxim Poliakovski
5  * 2008 Benjamin Larsson
6  * 2011 David Goldwich
7  *
8  * This file is part of FFmpeg.
9  *
10  * FFmpeg is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * FFmpeg is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with FFmpeg; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23  */
24 
25 /**
26  * @file
27  * This is a demuxer for Sony OpenMG Music files
28  *
29  * Known file extensions: ".oma", "aa3"
30  * The format of such files consists of three parts:
31  * - "ea3" header carrying overall info and metadata. Except for starting with
32  * "ea" instead of "ID", it's an ID3v2 header.
33  * - "EA3" header is a Sony-specific header containing information about
34  * the OpenMG file: codec type (usually ATRAC, can also be MP3 or WMA),
35  * codec specific info (packet size, sample rate, channels and so on)
36  * and DRM related info (file encryption, content id).
37  * - Sound data organized in packets follow the EA3 header
38  * (can be encrypted using the Sony DRM!).
39  *
40  */
41 
43 #include "avformat.h"
44 #include "internal.h"
45 #include "libavutil/intreadwrite.h"
46 #include "libavutil/des.h"
47 #include "oma.h"
48 #include "pcm.h"
49 #include "id3v2.h"
50 
51 
52 static const uint64_t leaf_table[] = {
53  0xd79e8283acea4620, 0x7a9762f445afd0d8,
54  0x354d60a60b8c79f1, 0x584e1cde00b07aee,
55  0x1573cd93da7df623, 0x47f98d79620dd535
56 };
57 
58 typedef struct OMAContext {
59  uint64_t content_start;
60  int encrypted;
61  uint16_t k_size;
62  uint16_t e_size;
63  uint16_t i_size;
64  uint16_t s_size;
65  uint32_t rid;
72  uint8_t iv[8];
73  struct AVDES av_des;
74 } OMAContext;
75 
76 static void hex_log(AVFormatContext *s, int level,
77  const char *name, const uint8_t *value, int len)
78 {
79  char buf[33];
80  len = FFMIN(len, 16);
81  if (av_log_get_level() < level)
82  return;
83  ff_data_to_hex(buf, value, len, 1);
84  buf[len << 1] = '\0';
85  av_log(s, level, "%s: %s\n", name, buf);
86 }
87 
88 static int kset(AVFormatContext *s, const uint8_t *r_val, const uint8_t *n_val,
89  int len)
90 {
91  OMAContext *oc = s->priv_data;
92 
93  if (!r_val && !n_val)
94  return -1;
95 
96  len = FFMIN(len, 16);
97 
98  /* use first 64 bits in the third round again */
99  if (r_val) {
100  if (r_val != oc->r_val) {
101  memset(oc->r_val, 0, 24);
102  memcpy(oc->r_val, r_val, len);
103  }
104  memcpy(&oc->r_val[16], r_val, 8);
105  }
106  if (n_val) {
107  if (n_val != oc->n_val) {
108  memset(oc->n_val, 0, 24);
109  memcpy(oc->n_val, n_val, len);
110  }
111  memcpy(&oc->n_val[16], n_val, 8);
112  }
113 
114  return 0;
115 }
116 
117 static int rprobe(AVFormatContext *s, uint8_t *enc_header, const uint8_t *r_val)
118 {
119  OMAContext *oc = s->priv_data;
120  unsigned int pos;
121  struct AVDES av_des;
122 
123  if (!enc_header || !r_val)
124  return -1;
125 
126  /* m_val */
127  av_des_init(&av_des, r_val, 192, 1);
128  av_des_crypt(&av_des, oc->m_val, &enc_header[48], 1, NULL, 1);
129 
130  /* s_val */
131  av_des_init(&av_des, oc->m_val, 64, 0);
132  av_des_crypt(&av_des, oc->s_val, NULL, 1, NULL, 0);
133 
134  /* sm_val */
135  pos = OMA_ENC_HEADER_SIZE + oc->k_size + oc->e_size;
136  av_des_init(&av_des, oc->s_val, 64, 0);
137  av_des_mac(&av_des, oc->sm_val, &enc_header[pos], (oc->i_size >> 3));
138 
139  pos += oc->i_size;
140 
141  return memcmp(&enc_header[pos], oc->sm_val, 8) ? -1 : 0;
142 }
143 
144 static int nprobe(AVFormatContext *s, uint8_t *enc_header, int size,
145  const uint8_t *n_val)
146 {
147  OMAContext *oc = s->priv_data;
148  uint32_t pos, taglen, datalen;
149  struct AVDES av_des;
150 
151  if (!enc_header || !n_val)
152  return -1;
153 
154  pos = OMA_ENC_HEADER_SIZE + oc->k_size;
155  if (!memcmp(&enc_header[pos], "EKB ", 4))
156  pos += 32;
157 
158  if (AV_RB32(&enc_header[pos]) != oc->rid)
159  av_log(s, AV_LOG_DEBUG, "Mismatching RID\n");
160 
161  taglen = AV_RB32(&enc_header[pos + 32]);
162  datalen = AV_RB32(&enc_header[pos + 36]) >> 4;
163 
164  if (pos + (uint64_t)taglen + (((uint64_t)datalen) << 4) + 44 > size)
165  return -1;
166 
167  pos += 44 + taglen;
168 
169  av_des_init(&av_des, n_val, 192, 1);
170  while (datalen-- > 0) {
171  av_des_crypt(&av_des, oc->r_val, &enc_header[pos], 2, NULL, 1);
172  kset(s, oc->r_val, NULL, 16);
173  if (!rprobe(s, enc_header, oc->r_val))
174  return 0;
175  pos += 16;
176  }
177 
178  return -1;
179 }
180 
182 {
183  OMAContext *oc = s->priv_data;
184  ID3v2ExtraMetaGEOB *geob = NULL;
185  uint8_t *gdata;
186 
187  oc->encrypted = 1;
188  av_log(s, AV_LOG_INFO, "File is encrypted\n");
189 
190  /* find GEOB metadata */
191  while (em) {
192  if (!strcmp(em->tag, "GEOB") &&
193  (geob = em->data) &&
194  (!strcmp(geob->description, "OMG_LSI") ||
195  !strcmp(geob->description, "OMG_BKLSI"))) {
196  break;
197  }
198  em = em->next;
199  }
200  if (!em) {
201  av_log(s, AV_LOG_ERROR, "No encryption header found\n");
202  return AVERROR_INVALIDDATA;
203  }
204 
205  if (geob->datasize < 64) {
206  av_log(s, AV_LOG_ERROR,
207  "Invalid GEOB data size: %u\n", geob->datasize);
208  return AVERROR_INVALIDDATA;
209  }
210 
211  gdata = geob->data;
212 
213  if (AV_RB16(gdata) != 1)
214  av_log(s, AV_LOG_WARNING, "Unknown version in encryption header\n");
215 
216  oc->k_size = AV_RB16(&gdata[2]);
217  oc->e_size = AV_RB16(&gdata[4]);
218  oc->i_size = AV_RB16(&gdata[6]);
219  oc->s_size = AV_RB16(&gdata[8]);
220 
221  if (memcmp(&gdata[OMA_ENC_HEADER_SIZE], "KEYRING ", 12)) {
222  av_log(s, AV_LOG_ERROR, "Invalid encryption header\n");
223  return AVERROR_INVALIDDATA;
224  }
225  if ( OMA_ENC_HEADER_SIZE + oc->k_size + oc->e_size + oc->i_size + 8 > geob->datasize
226  || OMA_ENC_HEADER_SIZE + 48 > geob->datasize
227  ) {
228  av_log(s, AV_LOG_ERROR, "Too little GEOB data\n");
229  return AVERROR_INVALIDDATA;
230  }
231  oc->rid = AV_RB32(&gdata[OMA_ENC_HEADER_SIZE + 28]);
232  av_log(s, AV_LOG_DEBUG, "RID: %.8x\n", oc->rid);
233 
234  memcpy(oc->iv, &header[0x58], 8);
235  hex_log(s, AV_LOG_DEBUG, "IV", oc->iv, 8);
236 
237  hex_log(s, AV_LOG_DEBUG, "CBC-MAC",
238  &gdata[OMA_ENC_HEADER_SIZE + oc->k_size + oc->e_size + oc->i_size],
239  8);
240 
241  if (s->keylen > 0) {
242  kset(s, s->key, s->key, s->keylen);
243  }
244  if (!memcmp(oc->r_val, (const uint8_t[8]){0}, 8) ||
245  rprobe(s, gdata, oc->r_val) < 0 &&
246  nprobe(s, gdata, geob->datasize, oc->n_val) < 0) {
247  int i;
248  for (i = 0; i < FF_ARRAY_ELEMS(leaf_table); i += 2) {
249  uint8_t buf[16];
250  AV_WL64(buf, leaf_table[i]);
251  AV_WL64(&buf[8], leaf_table[i + 1]);
252  kset(s, buf, buf, 16);
253  if (!rprobe(s, gdata, oc->r_val) ||
254  !nprobe(s, gdata, geob->datasize, oc->n_val))
255  break;
256  }
257  if (i >= FF_ARRAY_ELEMS(leaf_table)) {
258  av_log(s, AV_LOG_ERROR, "Invalid key\n");
259  return AVERROR_INVALIDDATA;
260  }
261  }
262 
263  /* e_val */
264  av_des_init(&oc->av_des, oc->m_val, 64, 0);
265  av_des_crypt(&oc->av_des, oc->e_val,
266  &gdata[OMA_ENC_HEADER_SIZE + 40], 1, NULL, 0);
267  hex_log(s, AV_LOG_DEBUG, "EK", oc->e_val, 8);
268 
269  /* init e_val */
270  av_des_init(&oc->av_des, oc->e_val, 64, 1);
271 
272  return 0;
273 }
274 
276 {
277  int ret, framesize, jsflag, samplerate;
278  uint32_t codec_params;
279  int16_t eid;
281  uint8_t *edata;
282  AVStream *st;
283  ID3v2ExtraMeta *extra_meta = NULL;
284  OMAContext *oc = s->priv_data;
285 
286  ff_id3v2_read(s, ID3v2_EA3_MAGIC, &extra_meta);
287  ret = avio_read(s->pb, buf, EA3_HEADER_SIZE);
288  if (ret < EA3_HEADER_SIZE)
289  return -1;
290 
291  if (memcmp(buf, ((const uint8_t[]){'E', 'A', '3'}), 3) ||
292  buf[4] != 0 || buf[5] != EA3_HEADER_SIZE) {
293  av_log(s, AV_LOG_ERROR, "Couldn't find the EA3 header !\n");
294  return AVERROR_INVALIDDATA;
295  }
296 
297  oc->content_start = avio_tell(s->pb);
298 
299  /* encrypted file */
300  eid = AV_RB16(&buf[6]);
301  if (eid != -1 && eid != -128 && decrypt_init(s, extra_meta, buf) < 0) {
302  ff_id3v2_free_extra_meta(&extra_meta);
303  return -1;
304  }
305 
306  ff_id3v2_free_extra_meta(&extra_meta);
307 
308  codec_params = AV_RB24(&buf[33]);
309 
310  st = avformat_new_stream(s, NULL);
311  if (!st)
312  return AVERROR(ENOMEM);
313 
314  st->start_time = 0;
316  st->codec->codec_tag = buf[32];
318  st->codec->codec_tag);
319 
320  switch (buf[32]) {
321  case OMA_CODECID_ATRAC3:
322  samplerate = ff_oma_srate_tab[(codec_params >> 13) & 7] * 100;
323  if (!samplerate) {
324  av_log(s, AV_LOG_ERROR, "Unsupported sample rate\n");
325  return AVERROR_INVALIDDATA;
326  }
327  if (samplerate != 44100)
328  avpriv_request_sample(s, "Sample rate %d", samplerate);
329 
330  framesize = (codec_params & 0x3FF) * 8;
331 
332  /* get stereo coding mode, 1 for joint-stereo */
333  jsflag = (codec_params >> 17) & 1;
334 
335  st->codec->channels = 2;
337  st->codec->sample_rate = samplerate;
338  st->codec->bit_rate = st->codec->sample_rate * framesize * 8 / 1024;
339 
340  /* fake the atrac3 extradata
341  * (wav format, makes stream copy to wav work) */
342  st->codec->extradata_size = 14;
344  if (!edata)
345  return AVERROR(ENOMEM);
346 
347  st->codec->extradata = edata;
348  AV_WL16(&edata[0], 1); // always 1
349  AV_WL32(&edata[2], samplerate); // samples rate
350  AV_WL16(&edata[6], jsflag); // coding mode
351  AV_WL16(&edata[8], jsflag); // coding mode
352  AV_WL16(&edata[10], 1); // always 1
353  // AV_WL16(&edata[12], 0); // always 0
354 
355  avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
356  break;
357  case OMA_CODECID_ATRAC3P:
358  st->codec->channels = (codec_params >> 10) & 7;
359  framesize = ((codec_params & 0x3FF) * 8) + 8;
360  samplerate = ff_oma_srate_tab[(codec_params >> 13) & 7] * 100;
361  if (!samplerate) {
362  av_log(s, AV_LOG_ERROR, "Unsupported sample rate\n");
363  return AVERROR_INVALIDDATA;
364  }
365  st->codec->sample_rate = samplerate;
366  st->codec->bit_rate = samplerate * framesize * 8 / 1024;
367  avpriv_set_pts_info(st, 64, 1, samplerate);
368  av_log(s, AV_LOG_ERROR, "Unsupported codec ATRAC3+!\n");
369  break;
370  case OMA_CODECID_MP3:
372  framesize = 1024;
373  break;
374  case OMA_CODECID_LPCM:
375  /* PCM 44.1 kHz 16 bit stereo big-endian */
376  st->codec->channels = 2;
378  st->codec->sample_rate = 44100;
379  framesize = 1024;
380  /* bit rate = sample rate x PCM block align (= 4) x 8 */
381  st->codec->bit_rate = st->codec->sample_rate * 32;
384  avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
385  break;
386  default:
387  av_log(s, AV_LOG_ERROR, "Unsupported codec %d!\n", buf[32]);
388  return AVERROR(ENOSYS);
389  }
390 
391  st->codec->block_align = framesize;
392 
393  return 0;
394 }
395 
396 
398 {
399  OMAContext *oc = s->priv_data;
400  int packet_size = s->streams[0]->codec->block_align;
401  int ret = av_get_packet(s->pb, pkt, packet_size);
402 
403  if (ret < 0)
404  return ret;
405  if (!ret)
406  return AVERROR_EOF;
407 
408  pkt->stream_index = 0;
409 
410  if (oc->encrypted) {
411  /* previous unencrypted block saved in IV for
412  * the next packet (CBC mode) */
413  av_des_crypt(&oc->av_des, pkt->data, pkt->data,
414  (ret >> 3), oc->iv, 1);
415  }
416 
417  return ret;
418 }
419 
421 {
422  const uint8_t *buf;
423  unsigned tag_len = 0;
424 
425  buf = p->buf;
426 
427  if (p->buf_size < ID3v2_HEADER_SIZE ||
429  buf[3] != 3 || // version must be 3
430  buf[4]) // flags byte zero
431  return 0;
432 
433  tag_len = ff_id3v2_tag_len(buf);
434 
435  /* This check cannot overflow as tag_len has at most 28 bits */
436  if (p->buf_size < tag_len + 5)
437  /* EA3 header comes late, might be outside of the probe buffer */
439 
440  buf += tag_len;
441 
442  if (!memcmp(buf, "EA3", 3) && !buf[4] && buf[5] == EA3_HEADER_SIZE)
443  return AVPROBE_SCORE_MAX;
444  else
445  return 0;
446 }
447 
448 static int oma_read_seek(struct AVFormatContext *s,
449  int stream_index, int64_t timestamp, int flags)
450 {
451  OMAContext *oc = s->priv_data;
452 
453  ff_pcm_read_seek(s, stream_index, timestamp, flags);
454 
455  if (oc->encrypted) {
456  /* readjust IV for CBC */
457  int64_t pos = avio_tell(s->pb);
458  if (pos < oc->content_start)
459  memset(oc->iv, 0, 8);
460  else {
461  if (avio_seek(s->pb, -8, SEEK_CUR) < 0 ||
462  avio_read(s->pb, oc->iv, 8) < 8) {
463  memset(oc->iv, 0, 8);
464  return -1;
465  }
466  }
467  }
468 
469  return 0;
470 }
471 
473  .name = "oma",
474  .long_name = NULL_IF_CONFIG_SMALL("Sony OpenMG audio"),
475  .priv_data_size = sizeof(OMAContext),
481  .extensions = "oma,omg,aa3",
482  .codec_tag = (const AVCodecTag* const []){ff_oma_codec_tags, 0},
483 };