Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * RAW DTS demuxer
  3.  * Copyright (c) 2008 Benjamin Larsson
  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. #include "libavcodec/bytestream.h"
  23. #include "libavcodec/dca.h"
  24. #include "libavcodec/dca_syncwords.h"
  25. #include "libavcodec/get_bits.h"
  26.  
  27. #include "avformat.h"
  28. #include "rawdec.h"
  29.  
  30. static int dts_probe(AVProbeData *p)
  31. {
  32.     const uint8_t *buf, *bufp;
  33.     uint32_t state = -1;
  34.     int markers[4*16] = {0};
  35.     int sum, max, i;
  36.     int64_t diff = 0;
  37.     uint8_t hdr[12 + AV_INPUT_BUFFER_PADDING_SIZE] = { 0 };
  38.  
  39.     buf = p->buf + FFMIN(4096, p->buf_size);
  40.  
  41.     for(; buf < (p->buf+p->buf_size)-2; buf+=2) {
  42.         int marker, sample_blocks, sample_rate, sr_code, framesize;
  43.         int lfe;
  44.         GetBitContext gb;
  45.  
  46.         bufp = buf;
  47.         state = (state << 16) | bytestream_get_be16(&bufp);
  48.  
  49.         if (buf - p->buf >= 4)
  50.             diff += FFABS(((int16_t)AV_RL16(buf)) - (int16_t)AV_RL16(buf-4));
  51.  
  52.         /* regular bitstream */
  53.         if (state == DCA_SYNCWORD_CORE_BE &&
  54.             (bytestream_get_be16(&bufp) & 0xFC00) == 0xFC00)
  55.             marker = 0;
  56.         else if (state == DCA_SYNCWORD_CORE_LE &&
  57.                  (bytestream_get_be16(&bufp) & 0x00FC) == 0x00FC)
  58.             marker = 1;
  59.  
  60.         /* 14 bits big-endian bitstream */
  61.         else if (state == DCA_SYNCWORD_CORE_14B_BE &&
  62.                  (bytestream_get_be16(&bufp) & 0xFFF0) == 0x07F0)
  63.             marker = 2;
  64.  
  65.         /* 14 bits little-endian bitstream */
  66.         else if (state == DCA_SYNCWORD_CORE_14B_LE &&
  67.                  (bytestream_get_be16(&bufp) & 0xF0FF) == 0xF007)
  68.             marker = 3;
  69.         else
  70.             continue;
  71.  
  72.         if (avpriv_dca_convert_bitstream(buf-2, 12, hdr, 12) < 0)
  73.             continue;
  74.  
  75.         init_get_bits(&gb, hdr, 96);
  76.         skip_bits_long(&gb, 39);
  77.  
  78.         sample_blocks = get_bits(&gb, 7) + 1;
  79.         if (sample_blocks < 8)
  80.             continue;
  81.  
  82.         framesize = get_bits(&gb, 14) + 1;
  83.         if (framesize < 95)
  84.             continue;
  85.  
  86.         skip_bits(&gb, 6);
  87.         sr_code = get_bits(&gb, 4);
  88.         sample_rate = avpriv_dca_sample_rates[sr_code];
  89.         if (sample_rate == 0)
  90.             continue;
  91.  
  92.         get_bits(&gb, 5);
  93.         if (get_bits(&gb, 1))
  94.             continue;
  95.  
  96.         skip_bits_long(&gb, 9);
  97.         lfe = get_bits(&gb, 2);
  98.         if (lfe > 2)
  99.             continue;
  100.  
  101.         marker += 4* sr_code;
  102.  
  103.         markers[marker] ++;
  104.     }
  105.  
  106.     sum = max = 0;
  107.     for (i=0; i<FF_ARRAY_ELEMS(markers); i++) {
  108.         sum += markers[i];
  109.         if (markers[max] < markers[i])
  110.             max = i;
  111.     }
  112.  
  113.     if (markers[max] > 3 && p->buf_size / markers[max] < 32*1024 &&
  114.         markers[max] * 4 > sum * 3 &&
  115.         diff / p->buf_size > 200)
  116.         return AVPROBE_SCORE_EXTENSION + 1;
  117.  
  118.     return 0;
  119. }
  120.  
  121. AVInputFormat ff_dts_demuxer = {
  122.     .name           = "dts",
  123.     .long_name      = NULL_IF_CONFIG_SMALL("raw DTS"),
  124.     .read_probe     = dts_probe,
  125.     .read_header    = ff_raw_audio_read_header,
  126.     .read_packet    = ff_raw_read_partial_packet,
  127.     .flags          = AVFMT_GENERIC_INDEX,
  128.     .extensions     = "dts",
  129.     .raw_codec_id   = AV_CODEC_ID_DTS,
  130. };
  131.