FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/aac_ac3_parser.c
Date: 2022-01-28 07:56:06
Exec Total Coverage
Lines: 47 48 97.9%
Branches: 29 30 96.7%

Line Branch Exec Source
1 /*
2 * Common AAC and AC-3 parser
3 * Copyright (c) 2003 Fabrice Bellard
4 * Copyright (c) 2003 Michael Niedermayer
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 #include "libavutil/channel_layout.h"
24 #include "libavutil/common.h"
25 #include "parser.h"
26 #include "aac_ac3_parser.h"
27
28 14890 int ff_aac_ac3_parse(AVCodecParserContext *s1,
29 AVCodecContext *avctx,
30 const uint8_t **poutbuf, int *poutbuf_size,
31 const uint8_t *buf, int buf_size)
32 {
33 14890 AACAC3ParseContext *s = s1->priv_data;
34 14890 ParseContext *pc = &s->pc;
35 int len, i;
36 int new_frame_start;
37 14890 int got_frame = 0;
38
39 21039 get_next:
40 21039 i=END_NOT_FOUND;
41
2/2
✓ Branch 0 taken 17769 times.
✓ Branch 1 taken 3270 times.
21039 if(s->remaining_size <= buf_size){
42
4/4
✓ Branch 0 taken 10243 times.
✓ Branch 1 taken 7526 times.
✓ Branch 2 taken 5770 times.
✓ Branch 3 taken 4473 times.
17769 if(s->remaining_size && !s->need_next_header){
43 5770 i= s->remaining_size;
44 5770 s->remaining_size = 0;
45 }else{ //we need a header first
46 11999 len=0;
47
2/2
✓ Branch 0 taken 72938 times.
✓ Branch 1 taken 1719 times.
74657 for(i=s->remaining_size; i<buf_size; i++){
48 72938 s->state = (s->state<<8) + buf[i];
49
2/2
✓ Branch 1 taken 10280 times.
✓ Branch 2 taken 62658 times.
72938 if((len=s->sync(s->state, s, &s->need_next_header, &new_frame_start)))
50 10280 break;
51 }
52
2/2
✓ Branch 0 taken 1719 times.
✓ Branch 1 taken 10280 times.
11999 if(len<=0){
53 1719 i=END_NOT_FOUND;
54 }else{
55 10280 got_frame = 1;
56 10280 s->state=0;
57 10280 i-= s->header_size -1;
58 10280 s->remaining_size = len;
59
4/4
✓ Branch 0 taken 9966 times.
✓ Branch 1 taken 314 times.
✓ Branch 2 taken 5835 times.
✓ Branch 3 taken 4131 times.
10280 if(!new_frame_start || pc->index+i<=0){
60 6149 s->remaining_size += i;
61 6149 goto get_next;
62 }
63
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4131 times.
4131 else if (i < 0) {
64 s->remaining_size += i;
65 }
66 }
67 }
68 }
69
70
2/2
✓ Branch 1 taken 4844 times.
✓ Branch 2 taken 10046 times.
14890 if(ff_combine_frame(pc, i, &buf, &buf_size)<0){
71 4844 s->remaining_size -= FFMIN(s->remaining_size, buf_size);
72 4844 *poutbuf = NULL;
73 4844 *poutbuf_size = 0;
74 4844 return buf_size;
75 }
76
77 10046 *poutbuf = buf;
78 10046 *poutbuf_size = buf_size;
79
80 /* update codec info */
81
2/2
✓ Branch 0 taken 4243 times.
✓ Branch 1 taken 5803 times.
10046 if(s->codec_id)
82 4243 avctx->codec_id = s->codec_id;
83
84
2/2
✓ Branch 0 taken 9901 times.
✓ Branch 1 taken 145 times.
10046 if (got_frame) {
85 /* Due to backwards compatible HE-AAC the sample rate, channel count,
86 and total number of samples found in an AAC ADTS header are not
87 reliable. Bit rate is still accurate because the total frame
88 duration in seconds is still correct (as is the number of bits in
89 the frame). */
90
2/2
✓ Branch 0 taken 4131 times.
✓ Branch 1 taken 5770 times.
9901 if (avctx->codec_id != AV_CODEC_ID_AAC) {
91 4131 avctx->sample_rate = s->sample_rate;
92
2/2
✓ Branch 0 taken 1488 times.
✓ Branch 1 taken 2643 times.
4131 if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) {
93 1488 avctx->channels = s->channels;
94 1488 avctx->channel_layout = s->channel_layout;
95 }
96 4131 s1->duration = s->samples;
97 4131 avctx->audio_service_type = s->service_type;
98 }
99
100 /* Calculate the average bit rate */
101 9901 s->frame_number++;
102
2/2
✓ Branch 0 taken 7258 times.
✓ Branch 1 taken 2643 times.
9901 if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) {
103 7258 avctx->bit_rate +=
104 7258 (s->bit_rate - avctx->bit_rate) / s->frame_number;
105 }
106 }
107
108 10046 return i;
109 }
110