LCOV - code coverage report
Current view: top level - libavformat - ac3dec.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 49 51 96.1 %
Date: 2017-12-18 20:14:19 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /*
       2             :  * RAW AC-3 and E-AC-3 demuxer
       3             :  * Copyright (c) 2007 Justin Ruggles <justin.ruggles@gmail.com>
       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 "libavutil/avassert.h"
      23             : #include "libavutil/crc.h"
      24             : #include "libavcodec/ac3_parser.h"
      25             : #include "avformat.h"
      26             : #include "rawdec.h"
      27             : 
      28       12260 : static int ac3_eac3_probe(AVProbeData *p, enum AVCodecID expected_codec_id)
      29             : {
      30       12260 :     int max_frames, first_frames = 0, frames;
      31             :     const uint8_t *buf, *buf2, *end;
      32       12260 :     enum AVCodecID codec_id = AV_CODEC_ID_AC3;
      33             : 
      34       12260 :     max_frames = 0;
      35       12260 :     buf = p->buf;
      36       12260 :     end = buf + p->buf_size;
      37             : 
      38   256561590 :     for(; buf < end; buf++) {
      39   256549330 :         if(buf > p->buf && !(buf[0] == 0x0B && buf[1] == 0x77)
      40   256534468 :                         && !(buf[0] == 0x77 && buf[1] == 0x0B) )
      41   256528920 :             continue;
      42       20410 :         buf2 = buf;
      43             : 
      44       45060 :         for(frames = 0; buf2 < end; frames++) {
      45             :             uint8_t buf3[4096];
      46             :             uint8_t bitstream_id;
      47             :             uint16_t frame_size;
      48             :             int i, ret;
      49             : 
      50       22426 :             if(!memcmp(buf2, "\x1\x10\0\0\0\0\0\0", 8)) {
      51           0 :                 if (buf2 + 16 > end)
      52       20306 :                     break;
      53           0 :                 buf2+=16;
      54             :             }
      55       22426 :             if (buf[0] == 0x77 && buf[1] == 0x0B) {
      56       27750 :                 for(i=0; i<8; i+=2) {
      57       22200 :                     buf3[i  ] = buf2[i+1];
      58       22200 :                     buf3[i+1] = buf2[i  ];
      59             :                 }
      60        5550 :                 ret = av_ac3_parse_header(buf3, 8, &bitstream_id,
      61             :                                           &frame_size);
      62             :             }else
      63       16876 :                 ret = av_ac3_parse_header(buf2, end - buf2, &bitstream_id,
      64             :                                           &frame_size);
      65       22426 :             if (ret < 0)
      66       15196 :                 break;
      67        7230 :             if(buf2 + frame_size > end)
      68         584 :                 break;
      69        6646 :             if (buf[0] == 0x77 && buf[1] == 0x0B) {
      70        3564 :                 av_assert0(frame_size <= sizeof(buf3));
      71     2032928 :                 for(i = 8; i < frame_size; i += 2) {
      72     2029364 :                     buf3[i  ] = buf2[i+1];
      73     2029364 :                     buf3[i+1] = buf2[i  ];
      74             :                 }
      75        3566 :                 if (av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf3 + 2, frame_size - 2))
      76        3562 :                     break;
      77             :             } else {
      78        3082 :                 if (av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf2 + 2, frame_size - 2))
      79         964 :                     break;
      80             :             }
      81        2120 :             if (bitstream_id > 10)
      82         514 :                 codec_id = AV_CODEC_ID_EAC3;
      83        2120 :             buf2 += frame_size;
      84             :         }
      85       20410 :         max_frames = FFMAX(max_frames, frames);
      86       20410 :         if(buf == p->buf)
      87       12260 :             first_frames = frames;
      88             :     }
      89       12260 :     if(codec_id != expected_codec_id) return 0;
      90             :     // keep this in sync with mp3 probe, both need to avoid
      91             :     // issues with MPEG-files!
      92        6130 :     if   (first_frames>=7) return AVPROBE_SCORE_EXTENSION + 1;
      93        6113 :     else if(max_frames>200)return AVPROBE_SCORE_EXTENSION;
      94        6113 :     else if(max_frames>=4) return AVPROBE_SCORE_EXTENSION/2;
      95        6097 :     else if(max_frames>=1) return 1;
      96        6067 :     else                   return 0;
      97             : }
      98             : 
      99             : #if CONFIG_AC3_DEMUXER
     100        6130 : static int ac3_probe(AVProbeData *p)
     101             : {
     102        6130 :     return ac3_eac3_probe(p, AV_CODEC_ID_AC3);
     103             : }
     104             : 
     105             : AVInputFormat ff_ac3_demuxer = {
     106             :     .name           = "ac3",
     107             :     .long_name      = NULL_IF_CONFIG_SMALL("raw AC-3"),
     108             :     .read_probe     = ac3_probe,
     109             :     .read_header    = ff_raw_audio_read_header,
     110             :     .read_packet    = ff_raw_read_partial_packet,
     111             :     .flags= AVFMT_GENERIC_INDEX,
     112             :     .extensions = "ac3",
     113             :     .raw_codec_id   = AV_CODEC_ID_AC3,
     114             : };
     115             : #endif
     116             : 
     117             : #if CONFIG_EAC3_DEMUXER
     118        6130 : static int eac3_probe(AVProbeData *p)
     119             : {
     120        6130 :     return ac3_eac3_probe(p, AV_CODEC_ID_EAC3);
     121             : }
     122             : 
     123             : AVInputFormat ff_eac3_demuxer = {
     124             :     .name           = "eac3",
     125             :     .long_name      = NULL_IF_CONFIG_SMALL("raw E-AC-3"),
     126             :     .read_probe     = eac3_probe,
     127             :     .read_header    = ff_raw_audio_read_header,
     128             :     .read_packet    = ff_raw_read_partial_packet,
     129             :     .flags          = AVFMT_GENERIC_INDEX,
     130             :     .extensions     = "eac3",
     131             :     .raw_codec_id   = AV_CODEC_ID_EAC3,
     132             : };
     133             : #endif

Generated by: LCOV version 1.13