Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * IEC 61937 demuxer
  3.  * Copyright (c) 2010 Anssi Hannula <anssi.hannula at iki.fi>
  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.  * IEC 61937 demuxer, used for compressed data in S/PDIF
  25.  * @author Anssi Hannula
  26.  */
  27.  
  28. #include "avformat.h"
  29. #include "spdif.h"
  30. #include "libavcodec/ac3.h"
  31. #include "libavcodec/aacadtsdec.h"
  32.  
  33. static int spdif_get_offset_and_codec(AVFormatContext *s,
  34.                                       enum IEC61937DataType data_type,
  35.                                       const char *buf, int *offset,
  36.                                       enum AVCodecID *codec)
  37. {
  38.     AACADTSHeaderInfo aac_hdr;
  39.     GetBitContext gbc;
  40.  
  41.     switch (data_type & 0xff) {
  42.     case IEC61937_AC3:
  43.         *offset = AC3_FRAME_SIZE << 2;
  44.         *codec = AV_CODEC_ID_AC3;
  45.         break;
  46.     case IEC61937_MPEG1_LAYER1:
  47.         *offset = spdif_mpeg_pkt_offset[1][0];
  48.         *codec = AV_CODEC_ID_MP1;
  49.         break;
  50.     case IEC61937_MPEG1_LAYER23:
  51.         *offset = spdif_mpeg_pkt_offset[1][0];
  52.         *codec = AV_CODEC_ID_MP3;
  53.         break;
  54.     case IEC61937_MPEG2_EXT:
  55.         *offset = 4608;
  56.         *codec = AV_CODEC_ID_MP3;
  57.         break;
  58.     case IEC61937_MPEG2_AAC:
  59.         init_get_bits(&gbc, buf, AAC_ADTS_HEADER_SIZE * 8);
  60.         if (avpriv_aac_parse_header(&gbc, &aac_hdr) < 0) {
  61.             if (s) /* be silent during a probe */
  62.                 av_log(s, AV_LOG_ERROR, "Invalid AAC packet in IEC 61937\n");
  63.             return AVERROR_INVALIDDATA;
  64.         }
  65.         *offset = aac_hdr.samples << 2;
  66.         *codec = AV_CODEC_ID_AAC;
  67.         break;
  68.     case IEC61937_MPEG2_LAYER1_LSF:
  69.         *offset = spdif_mpeg_pkt_offset[0][0];
  70.         *codec = AV_CODEC_ID_MP1;
  71.         break;
  72.     case IEC61937_MPEG2_LAYER2_LSF:
  73.         *offset = spdif_mpeg_pkt_offset[0][1];
  74.         *codec = AV_CODEC_ID_MP2;
  75.         break;
  76.     case IEC61937_MPEG2_LAYER3_LSF:
  77.         *offset = spdif_mpeg_pkt_offset[0][2];
  78.         *codec = AV_CODEC_ID_MP3;
  79.         break;
  80.     case IEC61937_DTS1:
  81.         *offset = 2048;
  82.         *codec = AV_CODEC_ID_DTS;
  83.         break;
  84.     case IEC61937_DTS2:
  85.         *offset = 4096;
  86.         *codec = AV_CODEC_ID_DTS;
  87.         break;
  88.     case IEC61937_DTS3:
  89.         *offset = 8192;
  90.         *codec = AV_CODEC_ID_DTS;
  91.         break;
  92.     default:
  93.         if (s) { /* be silent during a probe */
  94.             avpriv_request_sample(s, "Data type 0x%04x in IEC 61937",
  95.                                   data_type);
  96.         }
  97.         return AVERROR_PATCHWELCOME;
  98.     }
  99.     return 0;
  100. }
  101.  
  102. /* Largest offset between bursts we currently handle, i.e. AAC with
  103.    aac_hdr.samples = 4096 */
  104. #define SPDIF_MAX_OFFSET 16384
  105.  
  106. static int spdif_probe(AVProbeData *p)
  107. {
  108.     enum AVCodecID codec;
  109.     return ff_spdif_probe (p->buf, p->buf_size, &codec);
  110. }
  111.  
  112. int ff_spdif_probe(const uint8_t *p_buf, int buf_size, enum AVCodecID *codec)
  113. {
  114.     const uint8_t *buf = p_buf;
  115.     const uint8_t *probe_end = p_buf + FFMIN(2 * SPDIF_MAX_OFFSET, buf_size - 1);
  116.     const uint8_t *expected_code = buf + 7;
  117.     uint32_t state = 0;
  118.     int sync_codes = 0;
  119.     int consecutive_codes = 0;
  120.     int offset;
  121.  
  122.     for (; buf < probe_end; buf++) {
  123.         state = (state << 8) | *buf;
  124.  
  125.         if (state == (AV_BSWAP16C(SYNCWORD1) << 16 | AV_BSWAP16C(SYNCWORD2))
  126.                 && buf[1] < 0x37) {
  127.             sync_codes++;
  128.  
  129.             if (buf == expected_code) {
  130.                 if (++consecutive_codes >= 2)
  131.                     return AVPROBE_SCORE_MAX;
  132.             } else
  133.                 consecutive_codes = 0;
  134.  
  135.             if (buf + 4 + AAC_ADTS_HEADER_SIZE > p_buf + buf_size)
  136.                 break;
  137.  
  138.             /* continue probing to find more sync codes */
  139.             probe_end = FFMIN(buf + SPDIF_MAX_OFFSET, p_buf + buf_size - 1);
  140.  
  141.             /* skip directly to the next sync code */
  142.             if (!spdif_get_offset_and_codec(NULL, (buf[2] << 8) | buf[1],
  143.                                             &buf[5], &offset, codec)) {
  144.                 if (buf + offset >= p_buf + buf_size)
  145.                     break;
  146.                 expected_code = buf + offset;
  147.                 buf = expected_code - 7;
  148.             }
  149.         }
  150.     }
  151.  
  152.     if (!sync_codes)
  153.         return 0;
  154.  
  155.     if (sync_codes >= 6)
  156.         /* good amount of sync codes but with unexpected offsets */
  157.         return AVPROBE_SCORE_EXTENSION;
  158.  
  159.     /* some sync codes were found */
  160.     return AVPROBE_SCORE_EXTENSION / 4;
  161. }
  162.  
  163. static int spdif_read_header(AVFormatContext *s)
  164. {
  165.     s->ctx_flags |= AVFMTCTX_NOHEADER;
  166.     return 0;
  167. }
  168.  
  169. int ff_spdif_read_packet(AVFormatContext *s, AVPacket *pkt)
  170. {
  171.     AVIOContext *pb = s->pb;
  172.     enum IEC61937DataType data_type;
  173.     enum AVCodecID codec_id;
  174.     uint32_t state = 0;
  175.     int pkt_size_bits, offset, ret;
  176.  
  177.     while (state != (AV_BSWAP16C(SYNCWORD1) << 16 | AV_BSWAP16C(SYNCWORD2))) {
  178.         state = (state << 8) | avio_r8(pb);
  179.         if (url_feof(pb))
  180.             return AVERROR_EOF;
  181.     }
  182.  
  183.     data_type = avio_rl16(pb);
  184.     pkt_size_bits = avio_rl16(pb);
  185.  
  186.     if (pkt_size_bits % 16)
  187.         avpriv_request_sample(s, "Packet not ending at a 16-bit boundary");
  188.  
  189.     ret = av_new_packet(pkt, FFALIGN(pkt_size_bits, 16) >> 3);
  190.     if (ret)
  191.         return ret;
  192.  
  193.     pkt->pos = avio_tell(pb) - BURST_HEADER_SIZE;
  194.  
  195.     if (avio_read(pb, pkt->data, pkt->size) < pkt->size) {
  196.         av_free_packet(pkt);
  197.         return AVERROR_EOF;
  198.     }
  199.     ff_spdif_bswap_buf16((uint16_t *)pkt->data, (uint16_t *)pkt->data, pkt->size >> 1);
  200.  
  201.     ret = spdif_get_offset_and_codec(s, data_type, pkt->data,
  202.                                      &offset, &codec_id);
  203.     if (ret) {
  204.         av_free_packet(pkt);
  205.         return ret;
  206.     }
  207.  
  208.     /* skip over the padding to the beginning of the next frame */
  209.     avio_skip(pb, offset - pkt->size - BURST_HEADER_SIZE);
  210.  
  211.     if (!s->nb_streams) {
  212.         /* first packet, create a stream */
  213.         AVStream *st = avformat_new_stream(s, NULL);
  214.         if (!st) {
  215.             av_free_packet(pkt);
  216.             return AVERROR(ENOMEM);
  217.         }
  218.         st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
  219.         st->codec->codec_id = codec_id;
  220.     } else if (codec_id != s->streams[0]->codec->codec_id) {
  221.         avpriv_report_missing_feature(s, "Codec change in IEC 61937");
  222.         return AVERROR_PATCHWELCOME;
  223.     }
  224.  
  225.     if (!s->bit_rate && s->streams[0]->codec->sample_rate)
  226.         /* stream bitrate matches 16-bit stereo PCM bitrate for currently
  227.            supported codecs */
  228.         s->bit_rate = 2 * 16 * s->streams[0]->codec->sample_rate;
  229.  
  230.     return 0;
  231. }
  232.  
  233. AVInputFormat ff_spdif_demuxer = {
  234.     .name           = "spdif",
  235.     .long_name      = NULL_IF_CONFIG_SMALL("IEC 61937 (compressed data in S/PDIF)"),
  236.     .read_probe     = spdif_probe,
  237.     .read_header    = spdif_read_header,
  238.     .read_packet    = ff_spdif_read_packet,
  239.     .flags          = AVFMT_GENERIC_INDEX,
  240. };
  241.