FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
electronicarts.c
Go to the documentation of this file.
1 /* Electronic Arts Multimedia File Demuxer
2  * Copyright (c) 2004 The ffmpeg Project
3  * Copyright (c) 2006-2008 Peter Ross
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * Electronic Arts Multimedia file demuxer (WVE/UV2/etc.)
25  * by Robin Kay (komadori at gekkou.co.uk)
26  */
27 
28 #include "libavutil/intreadwrite.h"
29 #include "avformat.h"
30 #include "internal.h"
31 
32 #define SCHl_TAG MKTAG('S', 'C', 'H', 'l')
33 #define SEAD_TAG MKTAG('S', 'E', 'A', 'D') /* Sxxx header */
34 #define SNDC_TAG MKTAG('S', 'N', 'D', 'C') /* Sxxx data */
35 #define SEND_TAG MKTAG('S', 'E', 'N', 'D') /* Sxxx end */
36 #define SHEN_TAG MKTAG('S', 'H', 'E', 'N') /* SxEN header */
37 #define SDEN_TAG MKTAG('S', 'D', 'E', 'N') /* SxEN data */
38 #define SEEN_TAG MKTAG('S', 'E', 'E', 'N') /* SxEN end */
39 #define ISNh_TAG MKTAG('1', 'S', 'N', 'h') /* 1SNx header */
40 #define EACS_TAG MKTAG('E', 'A', 'C', 'S')
41 #define ISNd_TAG MKTAG('1', 'S', 'N', 'd') /* 1SNx data */
42 #define ISNe_TAG MKTAG('1', 'S', 'N', 'e') /* 1SNx end */
43 #define PT00_TAG MKTAG('P', 'T', 0x0, 0x0)
44 #define GSTR_TAG MKTAG('G', 'S', 'T', 'R')
45 #define SCDl_TAG MKTAG('S', 'C', 'D', 'l')
46 #define SCEl_TAG MKTAG('S', 'C', 'E', 'l')
47 #define kVGT_TAG MKTAG('k', 'V', 'G', 'T') /* TGV I-frame */
48 #define fVGT_TAG MKTAG('f', 'V', 'G', 'T') /* TGV P-frame */
49 #define mTCD_TAG MKTAG('m', 'T', 'C', 'D') /* MDEC */
50 #define MADk_TAG MKTAG('M', 'A', 'D', 'k') /* MAD I-frame */
51 #define MADm_TAG MKTAG('M', 'A', 'D', 'm') /* MAD P-frame */
52 #define MADe_TAG MKTAG('M', 'A', 'D', 'e') /* MAD lqp-frame */
53 #define MPCh_TAG MKTAG('M', 'P', 'C', 'h') /* MPEG-2 */
54 #define TGQs_TAG MKTAG('T', 'G', 'Q', 's') /* TGQ I-frame (appears in .TGQ files) */
55 #define pQGT_TAG MKTAG('p', 'Q', 'G', 'T') /* TGQ I-frame (appears in .UV files) */
56 #define pIQT_TAG MKTAG('p', 'I', 'Q', 'T') /* TQI/UV2 I-frame (.UV2/.WVE) */
57 #define MVhd_TAG MKTAG('M', 'V', 'h', 'd')
58 #define MV0K_TAG MKTAG('M', 'V', '0', 'K')
59 #define MV0F_TAG MKTAG('M', 'V', '0', 'F')
60 #define MVIh_TAG MKTAG('M', 'V', 'I', 'h') /* CMV header */
61 #define MVIf_TAG MKTAG('M', 'V', 'I', 'f') /* CMV I-frame */
62 
63 typedef struct EaDemuxContext {
65 
68  int width, height;
69  int nb_frames;
71 
74 
75  int bytes;
80 
81 static uint32_t read_arbitrary(AVIOContext *pb)
82 {
83  uint8_t size, byte;
84  int i;
85  uint32_t word;
86 
87  size = avio_r8(pb);
88 
89  word = 0;
90  for (i = 0; i < size; i++) {
91  byte = avio_r8(pb);
92  word <<= 8;
93  word |= byte;
94  }
95 
96  return word;
97 }
98 
100 {
101  EaDemuxContext *ea = s->priv_data;
102  AVIOContext *pb = s->pb;
103  int in_header = 1;
104  int compression_type = -1, revision = -1, revision2 = -1;
105 
106  ea->bytes = 2;
107  ea->sample_rate = -1;
108  ea->num_channels = 1;
109 
110  while (!url_feof(pb) && in_header) {
111  int in_subheader;
112  uint8_t byte;
113  byte = avio_r8(pb);
114 
115  switch (byte) {
116  case 0xFD:
117  av_log(s, AV_LOG_DEBUG, "entered audio subheader\n");
118  in_subheader = 1;
119  while (!url_feof(pb) && in_subheader) {
120  uint8_t subbyte;
121  subbyte = avio_r8(pb);
122 
123  switch (subbyte) {
124  case 0x80:
125  revision = read_arbitrary(pb);
126  av_log(s, AV_LOG_DEBUG,
127  "revision (element 0x80) set to 0x%08x\n", revision);
128  break;
129  case 0x82:
130  ea->num_channels = read_arbitrary(pb);
131  av_log(s, AV_LOG_DEBUG,
132  "num_channels (element 0x82) set to 0x%08x\n",
133  ea->num_channels);
134  break;
135  case 0x83:
136  compression_type = read_arbitrary(pb);
137  av_log(s, AV_LOG_DEBUG,
138  "compression_type (element 0x83) set to 0x%08x\n",
139  compression_type);
140  break;
141  case 0x84:
142  ea->sample_rate = read_arbitrary(pb);
143  av_log(s, AV_LOG_DEBUG,
144  "sample_rate (element 0x84) set to %i\n",
145  ea->sample_rate);
146  break;
147  case 0x85:
148  ea->num_samples = read_arbitrary(pb);
149  av_log(s, AV_LOG_DEBUG,
150  "num_samples (element 0x85) set to 0x%08x\n",
151  ea->num_samples);
152  break;
153  case 0x8A:
154  av_log(s, AV_LOG_DEBUG,
155  "element 0x%02x set to 0x%08x\n",
156  subbyte, read_arbitrary(pb));
157  av_log(s, AV_LOG_DEBUG, "exited audio subheader\n");
158  in_subheader = 0;
159  break;
160  case 0xA0:
161  revision2 = read_arbitrary(pb);
162  av_log(s, AV_LOG_DEBUG,
163  "revision2 (element 0xA0) set to 0x%08x\n",
164  revision2);
165  break;
166  case 0xFF:
167  av_log(s, AV_LOG_DEBUG,
168  "end of header block reached (within audio subheader)\n");
169  in_subheader = 0;
170  in_header = 0;
171  break;
172  default:
173  av_log(s, AV_LOG_DEBUG,
174  "element 0x%02x set to 0x%08x\n",
175  subbyte, read_arbitrary(pb));
176  break;
177  }
178  }
179  break;
180  case 0xFF:
181  av_log(s, AV_LOG_DEBUG, "end of header block reached\n");
182  in_header = 0;
183  break;
184  default:
185  av_log(s, AV_LOG_DEBUG,
186  "header element 0x%02x set to 0x%08x\n",
187  byte, read_arbitrary(pb));
188  break;
189  }
190  }
191 
192  switch (compression_type) {
193  case 0:
195  break;
196  case 7:
198  break;
199  case -1:
200  switch (revision) {
201  case 1:
203  break;
204  case 2:
206  break;
207  case 3:
209  break;
210  case -1:
211  break;
212  default:
213  avpriv_request_sample(s, "stream type; revision=%i", revision);
214  return 0;
215  }
216  switch (revision2) {
217  case 8:
219  break;
220  case 10:
221  switch (revision) {
222  case -1:
223  case 2: ea->audio_codec = AV_CODEC_ID_ADPCM_EA_R1; break;
224  case 3: ea->audio_codec = AV_CODEC_ID_ADPCM_EA_R2; break;
225  default:
226  avpriv_request_sample(s, "stream type; revision=%i, revision2=%i", revision, revision2);
227  return 0;
228  }
229  break;
230  case 16:
232  break;
233  case -1:
234  break;
235  default:
237  avpriv_request_sample(s, "stream type; revision2=%i", revision2);
238  return 0;
239  }
240  break;
241  default:
243  "stream type; compression_type=%i",
244  compression_type);
245  return 0;
246  }
247 
248  if (ea->sample_rate == -1)
249  ea->sample_rate = revision == 3 ? 48000 : 22050;
250 
251  return 1;
252 }
253 
255 {
256  EaDemuxContext *ea = s->priv_data;
257  AVIOContext *pb = s->pb;
258  int compression_type;
259 
260  ea->sample_rate = ea->big_endian ? avio_rb32(pb) : avio_rl32(pb);
261  ea->bytes = avio_r8(pb); /* 1=8-bit, 2=16-bit */
262  ea->num_channels = avio_r8(pb);
263  compression_type = avio_r8(pb);
264  avio_skip(pb, 13);
265 
266  switch (compression_type) {
267  case 0:
268  switch (ea->bytes) {
269  case 1:
271  break;
272  case 2:
274  break;
275  }
276  break;
277  case 1:
279  ea->bytes = 1;
280  break;
281  case 2:
283  break;
284  default:
286  "stream type; audio compression_type=%i",
287  compression_type);
288  }
289 }
290 
292 {
293  EaDemuxContext *ea = s->priv_data;
294  AVIOContext *pb = s->pb;
295 
296  ea->sample_rate = avio_rl32(pb);
297  ea->bytes = avio_rl32(pb); /* 1=8-bit, 2=16-bit */
298  ea->num_channels = avio_rl32(pb);
300 }
301 
303 {
304  EaDemuxContext *ea = s->priv_data;
305  AVIOContext *pb = s->pb;
306  avio_skip(pb, 4);
307  ea->width = avio_rl16(pb);
308  ea->height = avio_rl16(pb);
309  ea->time_base = (AVRational) { 1, 15 };
311 }
312 
314 {
315  EaDemuxContext *ea = s->priv_data;
316  AVIOContext *pb = s->pb;
317 
318  avio_skip(pb, 8);
319  ea->nb_frames = avio_rl32(pb);
320  avio_skip(pb, 4);
321  ea->time_base.den = avio_rl32(pb);
322  ea->time_base.num = avio_rl32(pb);
323  if (ea->time_base.den <= 0 || ea->time_base.num <= 0) {
324  av_log(s, AV_LOG_ERROR, "Timebase is invalid\n");
325  return AVERROR_INVALIDDATA;
326  }
328 
329  return 1;
330 }
331 
333 {
334  EaDemuxContext *ea = s->priv_data;
335  int fps;
336 
337  avio_skip(s->pb, 10);
338  fps = avio_rl16(s->pb);
339  if (fps)
340  ea->time_base = (AVRational) { 1, fps };
342 }
343 
344 /* Process EA file header.
345  * Return 1 if the EA file is valid and successfully opened, 0 otherwise. */
347 {
348  uint32_t blockid, size = 0;
349  EaDemuxContext *ea = s->priv_data;
350  AVIOContext *pb = s->pb;
351  int i;
352 
353  for (i = 0; i < 5 && (!ea->audio_codec || !ea->video_codec); i++) {
354  unsigned int startpos = avio_tell(pb);
355  int err = 0;
356 
357  blockid = avio_rl32(pb);
358  size = avio_rl32(pb);
359  if (i == 0)
360  ea->big_endian = size > 0x000FFFFF;
361  if (ea->big_endian)
362  size = av_bswap32(size);
363 
364  switch (blockid) {
365  case ISNh_TAG:
366  if (avio_rl32(pb) != EACS_TAG) {
367  avpriv_request_sample(s, "unknown 1SNh headerid");
368  return 0;
369  }
371  break;
372 
373  case SCHl_TAG:
374  case SHEN_TAG:
375  blockid = avio_rl32(pb);
376  if (blockid == GSTR_TAG) {
377  avio_skip(pb, 4);
378  } else if ((blockid & 0xFFFF) != PT00_TAG) {
379  avpriv_request_sample(s, "unknown SCHl headerid");
380  return 0;
381  }
383  break;
384 
385  case SEAD_TAG:
387  break;
388 
389  case MVIh_TAG:
391  break;
392 
393  case kVGT_TAG:
395  break;
396 
397  case mTCD_TAG:
399  break;
400 
401  case MPCh_TAG:
403  break;
404 
405  case pQGT_TAG:
406  case TGQs_TAG:
408  break;
409 
410  case pIQT_TAG:
412  break;
413 
414  case MADk_TAG:
416  break;
417 
418  case MVhd_TAG:
419  err = process_video_header_vp6(s);
420  break;
421  }
422 
423  if (err < 0) {
424  av_log(s, AV_LOG_ERROR, "error parsing header: %i\n", err);
425  return err;
426  }
427 
428  avio_seek(pb, startpos + size, SEEK_SET);
429  }
430 
431  avio_seek(pb, 0, SEEK_SET);
432 
433  return 1;
434 }
435 
436 static int ea_probe(AVProbeData *p)
437 {
438  switch (AV_RL32(&p->buf[0])) {
439  case ISNh_TAG:
440  case SCHl_TAG:
441  case SEAD_TAG:
442  case SHEN_TAG:
443  case kVGT_TAG:
444  case MADk_TAG:
445  case MPCh_TAG:
446  case MVhd_TAG:
447  case MVIh_TAG:
448  break;
449  default:
450  return 0;
451  }
452  if (AV_RL32(&p->buf[4]) > 0xfffff && AV_RB32(&p->buf[4]) > 0xfffff)
453  return 0;
454 
455  return AVPROBE_SCORE_MAX;
456 }
457 
459 {
460  EaDemuxContext *ea = s->priv_data;
461  AVStream *st;
462 
463  if (process_ea_header(s)<=0)
464  return AVERROR(EIO);
465 
466  if (ea->video_codec) {
467  /* initialize the video decoder stream */
468  st = avformat_new_stream(s, NULL);
469  if (!st)
470  return AVERROR(ENOMEM);
471  ea->video_stream_index = st->index;
473  st->codec->codec_id = ea->video_codec;
474  // parsing is necessary to make FFmpeg generate correct timestamps
477  st->codec->codec_tag = 0; /* no fourcc */
478  st->codec->width = ea->width;
479  st->codec->height = ea->height;
480  st->duration = st->nb_frames = ea->nb_frames;
481  if (ea->time_base.num)
482  avpriv_set_pts_info(st, 64, ea->time_base.num, ea->time_base.den);
483  st->r_frame_rate =
484  st->avg_frame_rate = av_inv_q(ea->time_base);
485  }
486 
487  if (ea->audio_codec) {
488  if (ea->num_channels <= 0 || ea->num_channels > 2) {
490  "Unsupported number of channels: %d\n", ea->num_channels);
491  ea->audio_codec = 0;
492  return 1;
493  }
494  if (ea->sample_rate <= 0) {
495  av_log(s, AV_LOG_ERROR,
496  "Unsupported sample rate: %d\n", ea->sample_rate);
497  ea->audio_codec = 0;
498  return 1;
499  }
500  if (ea->bytes <= 0) {
501  av_log(s, AV_LOG_ERROR,
502  "Invalid number of bytes per sample: %d\n", ea->bytes);
504  return 1;
505  }
506 
507  /* initialize the audio decoder stream */
508  st = avformat_new_stream(s, NULL);
509  if (!st)
510  return AVERROR(ENOMEM);
511  avpriv_set_pts_info(st, 33, 1, ea->sample_rate);
513  st->codec->codec_id = ea->audio_codec;
514  st->codec->codec_tag = 0; /* no tag */
515  st->codec->channels = ea->num_channels;
516  st->codec->sample_rate = ea->sample_rate;
517  st->codec->bits_per_coded_sample = ea->bytes * 8;
518  st->codec->bit_rate = st->codec->channels *
519  st->codec->sample_rate *
520  st->codec->bits_per_coded_sample / 4;
521  st->codec->block_align = st->codec->channels *
523  ea->audio_stream_index = st->index;
524  st->start_time = 0;
525  }
526 
527  return 1;
528 }
529 
531 {
532  EaDemuxContext *ea = s->priv_data;
533  AVIOContext *pb = s->pb;
534  int partial_packet = 0;
535  unsigned int chunk_type, chunk_size;
536  int ret = 0, packet_read = 0, key = 0;
537  int av_uninit(num_samples);
538 
539  while (!packet_read || partial_packet) {
540  chunk_type = avio_rl32(pb);
541  chunk_size = ea->big_endian ? avio_rb32(pb) : avio_rl32(pb);
542  if (chunk_size <= 8)
543  return AVERROR_INVALIDDATA;
544  chunk_size -= 8;
545 
546  switch (chunk_type) {
547  /* audio data */
548  case ISNh_TAG:
549  /* header chunk also contains data; skip over the header portion */
550  if (chunk_size < 32)
551  return AVERROR_INVALIDDATA;
552  avio_skip(pb, 32);
553  chunk_size -= 32;
554  case ISNd_TAG:
555  case SCDl_TAG:
556  case SNDC_TAG:
557  case SDEN_TAG:
558  if (!ea->audio_codec) {
559  avio_skip(pb, chunk_size);
560  break;
561  } else if (ea->audio_codec == AV_CODEC_ID_PCM_S16LE_PLANAR ||
562  ea->audio_codec == AV_CODEC_ID_MP3) {
563  num_samples = avio_rl32(pb);
564  avio_skip(pb, 8);
565  chunk_size -= 12;
566  }
567  if (partial_packet) {
568  avpriv_request_sample(s, "video header followed by audio packet");
569  av_free_packet(pkt);
570  partial_packet = 0;
571  }
572  ret = av_get_packet(pb, pkt, chunk_size);
573  if (ret < 0)
574  return ret;
575  pkt->stream_index = ea->audio_stream_index;
576 
577  switch (ea->audio_codec) {
583  if (pkt->size < 4) {
584  av_log(s, AV_LOG_ERROR, "Packet is too short\n");
585  av_free_packet(pkt);
586  return AVERROR_INVALIDDATA;
587  }
589  pkt->duration = AV_RB32(pkt->data);
590  else
591  pkt->duration = AV_RL32(pkt->data);
592  break;
594  pkt->duration = ret * 2 / ea->num_channels;
595  break;
597  case AV_CODEC_ID_MP3:
598  pkt->duration = num_samples;
599  break;
600  default:
601  pkt->duration = chunk_size / (ea->bytes * ea->num_channels);
602  }
603 
604  packet_read = 1;
605  break;
606 
607  /* ending tag */
608  case 0:
609  case ISNe_TAG:
610  case SCEl_TAG:
611  case SEND_TAG:
612  case SEEN_TAG:
613  ret = AVERROR(EIO);
614  packet_read = 1;
615  break;
616 
617  case MVIh_TAG:
618  case kVGT_TAG:
619  case pQGT_TAG:
620  case TGQs_TAG:
621  case MADk_TAG:
622  key = AV_PKT_FLAG_KEY;
623  case MVIf_TAG:
624  case fVGT_TAG:
625  case MADm_TAG:
626  case MADe_TAG:
627  avio_seek(pb, -8, SEEK_CUR); // include chunk preamble
628  chunk_size += 8;
629  goto get_video_packet;
630 
631  case mTCD_TAG:
632  avio_skip(pb, 8); // skip ea DCT header
633  chunk_size -= 8;
634  goto get_video_packet;
635 
636  case MV0K_TAG:
637  case MPCh_TAG:
638  case pIQT_TAG:
639  key = AV_PKT_FLAG_KEY;
640  case MV0F_TAG:
641 get_video_packet:
642  if (partial_packet) {
643  ret = av_append_packet(pb, pkt, chunk_size);
644  } else
645  ret = av_get_packet(pb, pkt, chunk_size);
646  if (ret < 0) {
647  packet_read = 1;
648  break;
649  }
650  partial_packet = chunk_type == MVIh_TAG;
651  pkt->stream_index = ea->video_stream_index;
652  pkt->flags |= key;
653  packet_read = 1;
654  break;
655 
656  default:
657  avio_skip(pb, chunk_size);
658  break;
659  }
660  }
661 
662  if (ret < 0 && partial_packet)
663  av_free_packet(pkt);
664  return ret;
665 }
666 
668  .name = "ea",
669  .long_name = NULL_IF_CONFIG_SMALL("Electronic Arts Multimedia"),
670  .priv_data_size = sizeof(EaDemuxContext),
671  .read_probe = ea_probe,
674 };