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, const char *name, const uint8_t *value, int len)
77 {
78  char buf[33];
79  len = FFMIN(len, 16);
80  if (av_log_get_level() < level)
81  return;
82  ff_data_to_hex(buf, value, len, 1);
83  buf[len<<1] = '\0';
84  av_log(s, level, "%s: %s\n", name, buf);
85 }
86 
87 static int kset(AVFormatContext *s, const uint8_t *r_val, const uint8_t *n_val, int len)
88 {
89  OMAContext *oc = s->priv_data;
90 
91  if (!r_val && !n_val)
92  return -1;
93 
94  len = FFMIN(len, 16);
95 
96  /* use first 64 bits in the third round again */
97  if (r_val) {
98  if (r_val != oc->r_val) {
99  memset(oc->r_val, 0, 24);
100  memcpy(oc->r_val, r_val, len);
101  }
102  memcpy(&oc->r_val[16], r_val, 8);
103  }
104  if (n_val) {
105  if (n_val != oc->n_val) {
106  memset(oc->n_val, 0, 24);
107  memcpy(oc->n_val, n_val, len);
108  }
109  memcpy(&oc->n_val[16], n_val, 8);
110  }
111 
112  return 0;
113 }
114 
115 static int rprobe(AVFormatContext *s, uint8_t *enc_header, const uint8_t *r_val)
116 {
117  OMAContext *oc = s->priv_data;
118  unsigned int pos;
119  struct AVDES av_des;
120 
121  if (!enc_header || !r_val)
122  return -1;
123 
124  /* m_val */
125  av_des_init(&av_des, r_val, 192, 1);
126  av_des_crypt(&av_des, oc->m_val, &enc_header[48], 1, NULL, 1);
127 
128  /* s_val */
129  av_des_init(&av_des, oc->m_val, 64, 0);
130  av_des_crypt(&av_des, oc->s_val, NULL, 1, NULL, 0);
131 
132  /* sm_val */
133  pos = OMA_ENC_HEADER_SIZE + oc->k_size + oc->e_size;
134  av_des_init(&av_des, oc->s_val, 64, 0);
135  av_des_mac(&av_des, oc->sm_val, &enc_header[pos], (oc->i_size >> 3));
136 
137  pos += oc->i_size;
138 
139  return memcmp(&enc_header[pos], oc->sm_val, 8) ? -1 : 0;
140 }
141 
142 static int nprobe(AVFormatContext *s, uint8_t *enc_header, int size, const uint8_t *n_val)
143 {
144  OMAContext *oc = s->priv_data;
145  uint32_t pos, taglen, datalen;
146  struct AVDES av_des;
147 
148  if (!enc_header || !n_val)
149  return -1;
150 
151  pos = OMA_ENC_HEADER_SIZE + oc->k_size;
152  if (!memcmp(&enc_header[pos], "EKB ", 4))
153  pos += 32;
154 
155  if (AV_RB32(&enc_header[pos]) != oc->rid)
156  av_log(s, AV_LOG_DEBUG, "Mismatching RID\n");
157 
158  taglen = AV_RB32(&enc_header[pos+32]);
159  datalen = AV_RB32(&enc_header[pos+36]) >> 4;
160 
161  if(pos + (uint64_t)taglen + (((uint64_t)datalen)<<4) + 44 > size)
162  return -1;
163 
164  pos += 44 + taglen;
165 
166  av_des_init(&av_des, n_val, 192, 1);
167  while (datalen-- > 0) {
168  av_des_crypt(&av_des, oc->r_val, &enc_header[pos], 2, NULL, 1);
169  kset(s, oc->r_val, NULL, 16);
170  if (!rprobe(s, enc_header, oc->r_val))
171  return 0;
172  pos += 16;
173  }
174 
175  return -1;
176 }
177 
179 {
180  OMAContext *oc = s->priv_data;
181  ID3v2ExtraMetaGEOB *geob = NULL;
182  uint8_t *gdata;
183 
184  oc->encrypted = 1;
185  av_log(s, AV_LOG_INFO, "File is encrypted\n");
186 
187  /* find GEOB metadata */
188  while (em) {
189  if (!strcmp(em->tag, "GEOB") &&
190  (geob = em->data) &&
191  (!strcmp(geob->description, "OMG_LSI") ||
192  !strcmp(geob->description, "OMG_BKLSI"))) {
193  break;
194  }
195  em = em->next;
196  }
197  if (!em) {
198  av_log(s, AV_LOG_ERROR, "No encryption header found\n");
199  return -1;
200  }
201 
202  if (geob->datasize < 64) {
203  av_log(s, AV_LOG_ERROR, "Invalid GEOB data size: %u\n", geob->datasize);
204  return -1;
205  }
206 
207  gdata = geob->data;
208 
209  if (AV_RB16(gdata) != 1)
210  av_log(s, AV_LOG_WARNING, "Unknown version in encryption header\n");
211 
212  oc->k_size = AV_RB16(&gdata[2]);
213  oc->e_size = AV_RB16(&gdata[4]);
214  oc->i_size = AV_RB16(&gdata[6]);
215  oc->s_size = AV_RB16(&gdata[8]);
216 
217  if (memcmp(&gdata[OMA_ENC_HEADER_SIZE], "KEYRING ", 12)) {
218  av_log(s, AV_LOG_ERROR, "Invalid encryption header\n");
219  return -1;
220  }
221  if ( OMA_ENC_HEADER_SIZE + oc->k_size + oc->e_size + oc->i_size + 8 > geob->datasize
222  || OMA_ENC_HEADER_SIZE + 48 > geob->datasize
223  ) {
224  av_log(s, AV_LOG_ERROR, "Too little GEOB data\n");
225  return AVERROR_INVALIDDATA;
226  }
227  oc->rid = AV_RB32(&gdata[OMA_ENC_HEADER_SIZE + 28]);
228  av_log(s, AV_LOG_DEBUG, "RID: %.8x\n", oc->rid);
229 
230  memcpy(oc->iv, &header[0x58], 8);
231  hex_log(s, AV_LOG_DEBUG, "IV", oc->iv, 8);
232 
233  hex_log(s, AV_LOG_DEBUG, "CBC-MAC", &gdata[OMA_ENC_HEADER_SIZE+oc->k_size+oc->e_size+oc->i_size], 8);
234 
235  if (s->keylen > 0) {
236  kset(s, s->key, s->key, s->keylen);
237  }
238  if (!memcmp(oc->r_val, (const uint8_t[8]){0}, 8) ||
239  rprobe(s, gdata, oc->r_val) < 0 &&
240  nprobe(s, gdata, geob->datasize, oc->n_val) < 0) {
241  int i;
242  for (i = 0; i < FF_ARRAY_ELEMS(leaf_table); i += 2) {
243  uint8_t buf[16];
244  AV_WL64(buf, leaf_table[i]);
245  AV_WL64(&buf[8], leaf_table[i+1]);
246  kset(s, buf, buf, 16);
247  if (!rprobe(s, gdata, oc->r_val) || !nprobe(s, gdata, geob->datasize, oc->n_val))
248  break;
249  }
250  if (i >= FF_ARRAY_ELEMS(leaf_table)) {
251  av_log(s, AV_LOG_ERROR, "Invalid key\n");
252  return -1;
253  }
254  }
255 
256  /* e_val */
257  av_des_init(&oc->av_des, oc->m_val, 64, 0);
258  av_des_crypt(&oc->av_des, oc->e_val, &gdata[OMA_ENC_HEADER_SIZE + 40], 1, NULL, 0);
259  hex_log(s, AV_LOG_DEBUG, "EK", oc->e_val, 8);
260 
261  /* init e_val */
262  av_des_init(&oc->av_des, oc->e_val, 64, 1);
263 
264  return 0;
265 }
266 
268 {
269  int ret, framesize, jsflag, samplerate;
270  uint32_t codec_params;
271  int16_t eid;
273  uint8_t *edata;
274  AVStream *st;
275  ID3v2ExtraMeta *extra_meta = NULL;
276  OMAContext *oc = s->priv_data;
277 
278  ff_id3v2_read(s, ID3v2_EA3_MAGIC, &extra_meta);
279  ret = avio_read(s->pb, buf, EA3_HEADER_SIZE);
280  if (ret < EA3_HEADER_SIZE)
281  return -1;
282 
283  if (memcmp(buf, ((const uint8_t[]){'E', 'A', '3'}),3) || buf[4] != 0 || buf[5] != EA3_HEADER_SIZE) {
284  av_log(s, AV_LOG_ERROR, "Couldn't find the EA3 header !\n");
285  return -1;
286  }
287 
288  oc->content_start = avio_tell(s->pb);
289 
290  /* encrypted file */
291  eid = AV_RB16(&buf[6]);
292  if (eid != -1 && eid != -128 && decrypt_init(s, extra_meta, buf) < 0) {
293  ff_id3v2_free_extra_meta(&extra_meta);
294  return -1;
295  }
296 
297  ff_id3v2_free_extra_meta(&extra_meta);
298 
299  codec_params = AV_RB24(&buf[33]);
300 
301  st = avformat_new_stream(s, NULL);
302  if (!st)
303  return AVERROR(ENOMEM);
304 
305  st->start_time = 0;
307  st->codec->codec_tag = buf[32];
309 
310  switch (buf[32]) {
311  case OMA_CODECID_ATRAC3:
312  samplerate = ff_oma_srate_tab[(codec_params >> 13) & 7] * 100;
313  if (!samplerate) {
314  av_log(s, AV_LOG_ERROR, "Unsupported sample rate\n");
315  return AVERROR_INVALIDDATA;
316  }
317  if (samplerate != 44100)
318  avpriv_request_sample(s, "Sample rate %d", samplerate);
319 
320  framesize = (codec_params & 0x3FF) * 8;
321  jsflag = (codec_params >> 17) & 1; /* get stereo coding mode, 1 for joint-stereo */
322  st->codec->channels = 2;
324  st->codec->sample_rate = samplerate;
325  st->codec->bit_rate = st->codec->sample_rate * framesize * 8 / 1024;
326 
327  /* fake the atrac3 extradata (wav format, makes stream copy to wav work) */
328  st->codec->extradata_size = 14;
330  if (!edata)
331  return AVERROR(ENOMEM);
332 
333  st->codec->extradata = edata;
334  AV_WL16(&edata[0], 1); // always 1
335  AV_WL32(&edata[2], samplerate); // samples rate
336  AV_WL16(&edata[6], jsflag); // coding mode
337  AV_WL16(&edata[8], jsflag); // coding mode
338  AV_WL16(&edata[10], 1); // always 1
339  // AV_WL16(&edata[12], 0); // always 0
340 
341  avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
342  break;
343  case OMA_CODECID_ATRAC3P:
344  st->codec->channels = (codec_params >> 10) & 7;
345  framesize = ((codec_params & 0x3FF) * 8) + 8;
346  samplerate = ff_oma_srate_tab[(codec_params >> 13) & 7] * 100;
347  if (!samplerate) {
348  av_log(s, AV_LOG_ERROR, "Unsupported sample rate\n");
349  return AVERROR_INVALIDDATA;
350  }
351  st->codec->sample_rate = samplerate;
352  st->codec->bit_rate = samplerate * framesize * 8 / 1024;
353  avpriv_set_pts_info(st, 64, 1, samplerate);
354  av_log(s, AV_LOG_ERROR, "Unsupported codec ATRAC3+!\n");
355  break;
356  case OMA_CODECID_MP3:
358  framesize = 1024;
359  break;
360  case OMA_CODECID_LPCM:
361  /* PCM 44.1 kHz 16 bit stereo big-endian */
362  st->codec->channels = 2;
364  st->codec->sample_rate = 44100;
365  framesize = 1024;
366  /* bit rate = sample rate x PCM block align (= 4) x 8 */
367  st->codec->bit_rate = st->codec->sample_rate * 32;
369  avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
370  break;
371  default:
372  av_log(s, AV_LOG_ERROR, "Unsupported codec %d!\n",buf[32]);
373  return -1;
374  }
375 
376  st->codec->block_align = framesize;
377 
378  return 0;
379 }
380 
381 
383 {
384  OMAContext *oc = s->priv_data;
385  int packet_size = s->streams[0]->codec->block_align;
386  int ret = av_get_packet(s->pb, pkt, packet_size);
387 
388  if (ret <= 0)
389  return AVERROR(EIO);
390 
391  pkt->stream_index = 0;
392 
393  if (oc->encrypted) {
394  /* previous unencrypted block saved in IV for the next packet (CBC mode) */
395  av_des_crypt(&oc->av_des, pkt->data, pkt->data, (ret >> 3), oc->iv, 1);
396  }
397 
398  return ret;
399 }
400 
402 {
403  const uint8_t *buf;
404  unsigned tag_len = 0;
405 
406  buf = p->buf;
407 
408  if (p->buf_size < ID3v2_HEADER_SIZE ||
410  buf[3] != 3 || // version must be 3
411  buf[4]) // flags byte zero
412  return 0;
413 
414  tag_len = ff_id3v2_tag_len(buf);
415 
416  /* This check cannot overflow as tag_len has at most 28 bits */
417  if (p->buf_size < tag_len + 5)
418  /* EA3 header comes late, might be outside of the probe buffer */
419  return AVPROBE_SCORE_MAX / 2;
420 
421  buf += tag_len;
422 
423  if (!memcmp(buf, "EA3", 3) && !buf[4] && buf[5] == EA3_HEADER_SIZE)
424  return AVPROBE_SCORE_MAX;
425  else
426  return 0;
427 }
428 
429 static int oma_read_seek(struct AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
430 {
431  OMAContext *oc = s->priv_data;
432 
433  ff_pcm_read_seek(s, stream_index, timestamp, flags);
434 
435  if (oc->encrypted) {
436  /* readjust IV for CBC */
437  int64_t pos = avio_tell(s->pb);
438  if (pos < oc->content_start)
439  memset(oc->iv, 0, 8);
440  else {
441  if (avio_seek(s->pb, -8, SEEK_CUR) < 0 || avio_read(s->pb, oc->iv, 8) < 8) {
442  memset(oc->iv, 0, 8);
443  return -1;
444  }
445  }
446  }
447 
448  return 0;
449 }
450 
452  .name = "oma",
453  .long_name = NULL_IF_CONFIG_SMALL("Sony OpenMG audio"),
454  .priv_data_size = sizeof(OMAContext),
460  .extensions = "oma,omg,aa3",
461  .codec_tag = (const AVCodecTag* const []){ff_oma_codec_tags, 0},
462 };
const char * name
Definition: avisynth_c.h:675
static int oma_read_header(AVFormatContext *s)
Definition: omadec.c:267
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
const char * s
Definition: avisynth_c.h:668
void * data
Definition: id3v2.h:57
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
AVInputFormat ff_oma_demuxer
Definition: omadec.c:451
uint8_t r_val[24]
Definition: omadec.c:66
uint8_t sm_val[8]
Definition: omadec.c:70
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:153
void av_des_mac(AVDES *d, uint8_t *dst, const uint8_t *src, int count)
Calculates CBC-MAC using the DES algorithm.
Definition: des.c:335
uint32_t datasize
Definition: id3v2.h:62
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:199
struct OMAContext OMAContext
uint32_t rid
Definition: omadec.c:65
#define AV_RB24
uint8_t iv[8]
Definition: omadec.c:72
#define ID3v2_EA3_MAGIC
Definition: oma.h:29
#define FF_ARRAY_ELEMS(a)
#define AV_CH_LAYOUT_STEREO
static int kset(AVFormatContext *s, const uint8_t *r_val, const uint8_t *n_val, int len)
Definition: omadec.c:87
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
static int oma_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: omadec.c:382
int encrypted
Definition: omadec.c:60
const AVCodecTag ff_oma_codec_tags[]
Definition: oma.c:27
Format I/O context.
Definition: avformat.h:944
#define AV_WL32(p, darg)
Definition: intreadwrite.h:282
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
#define ID3v2_HEADER_SIZE
Definition: id3v2.h:30
uint8_t
int av_log_get_level(void)
Definition: log.c:264
#define AV_RB32
static AVPacket pkt
Definition: demuxing.c:56
enum AVStreamParseType need_parsing
Definition: avformat.h:811
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
AVStream ** streams
Definition: avformat.h:992
uint8_t * description
Definition: id3v2.h:65
uint8_t * data
uint16_t i_size
Definition: omadec.c:63
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:248
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
full parsing and repack with timestamp and position generation by parser for raw this assumes that ea...
Definition: avformat.h:586
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:478
uint8_t * data
Definition: id3v2.h:66
int av_get_bits_per_sample(enum AVCodecID codec_id)
Return codec bits per sample.
#define AV_RB16
#define AV_WL16(p, darg)
Definition: intreadwrite.h:250
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
uint64_t content_start
Definition: omadec.c:59
int av_des_init(AVDES *d, const uint8_t *key, int key_bits, av_unused int decrypt)
Definition: des.c:289
void ff_id3v2_free_extra_meta(ID3v2ExtraMeta **extra_meta)
Free memory allocated parsing special (non-text) metadata.
Definition: id3v2.c:813
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
struct AVDES av_des
Definition: omadec.c:73
int size
uint64_t channel_layout
Audio channel layout.
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:337
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:336
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
int bit_rate
the average bitrate
audio channel layout utility functions
#define FFMIN(a, b)
Definition: common.h:58
static int read_probe(AVProbeData *pd)
ret
Definition: avfilter.c:821
uint16_t s_size
Definition: omadec.c:64
int ff_pcm_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
FIXME Range Coding of cr are level
Definition: snow.txt:367
uint8_t s_val[8]
Definition: omadec.c:69
#define OMA_ENC_HEADER_SIZE
Definition: oma.h:30
void ff_id3v2_read(AVFormatContext *s, const char *magic, ID3v2ExtraMeta **extra_meta)
Read an ID3v2 tag, including supported extra metadata.
Definition: id3v2.c:780
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:517
Stream structure.
Definition: avformat.h:643
#define EA3_HEADER_SIZE
Definition: oma.h:28
NULL
Definition: eval.c:55
uint16_t k_size
Definition: omadec.c:61
enum AVMediaType codec_type
struct ID3v2ExtraMeta * next
Definition: id3v2.h:58
enum AVCodecID codec_id
static int decrypt_init(AVFormatContext *s, ID3v2ExtraMeta *em, uint8_t *header)
Definition: omadec.c:178
int sample_rate
samples per second
AVIOContext * pb
I/O context.
Definition: avformat.h:977
static void hex_log(AVFormatContext *s, int level, const char *name, const uint8_t *value, int len)
Definition: omadec.c:76
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> (&#39;D&#39;<<24) + (&#39;C&#39;<<16) + (&#39;B&#39;<<8) + &#39;A&#39;).
void * buf
Definition: avisynth_c.h:594
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
Definition: libcdio.c:114
double value
Definition: eval.c:82
#define AVFMT_GENERIC_INDEX
Use generic index building code.
Definition: avformat.h:353
synthesis window for stochastic i
static const uint64_t leaf_table[]
Definition: omadec.c:52
This structure contains the data a format has to probe a file.
Definition: avformat.h:334
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
static int oma_read_seek(struct AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: omadec.c:429
static int flags
Definition: cpu.c:23
uint8_t e_val[8]
Definition: omadec.c:71
void av_des_crypt(AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt)
Encrypts / decrypts using the DES algorithm.
Definition: des.c:331
#define AVPROBE_SCORE_MAX
maximum score, half of that is used for file-extension-based detection
Definition: avformat.h:340
const uint8_t * key
Definition: avformat.h:1047
Main libavformat public API header.
uint8_t m_val[8]
Definition: omadec.c:68
#define AV_WL64(p, darg)
Definition: intreadwrite.h:328
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
int ff_id3v2_match(const uint8_t *buf, const char *magic)
Detect ID3v2 Header.
Definition: id3v2.c:139
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base...
Definition: avformat.h:689
const char * tag
Definition: id3v2.h:56
static int nprobe(AVFormatContext *s, uint8_t *enc_header, int size, const uint8_t *n_val)
Definition: omadec.c:142
int len
int channels
number of audio channels
int ff_id3v2_tag_len(const uint8_t *buf)
Get the length of an ID3v2 tag.
Definition: id3v2.c:152
void * priv_data
Format private data.
Definition: avformat.h:964
static int rprobe(AVFormatContext *s, uint8_t *enc_header, const uint8_t *r_val)
Definition: omadec.c:115
uint8_t n_val[24]
Definition: omadec.c:67
#define AV_LOG_INFO
Definition: log.h:156
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:461
Definition: des.h:27
uint16_t e_size
Definition: omadec.c:62
char * ff_data_to_hex(char *buf, const uint8_t *src, int size, int lowercase)
This structure stores compressed data.
const uint16_t ff_oma_srate_tab[8]
Definition: oma.c:25
static int oma_read_probe(AVProbeData *p)
Definition: omadec.c:401