| 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 "config_components.h" | ||
| 24 | |||
| 25 | #include "libavutil/channel_layout.h" | ||
| 26 | #include "libavutil/common.h" | ||
| 27 | #include "parser.h" | ||
| 28 | #include "aac_ac3_parser.h" | ||
| 29 | #include "ac3_parser_internal.h" | ||
| 30 | #include "adts_header.h" | ||
| 31 | |||
| 32 | 18140 | int ff_aac_ac3_parse(AVCodecParserContext *s1, | |
| 33 | AVCodecContext *avctx, | ||
| 34 | const uint8_t **poutbuf, int *poutbuf_size, | ||
| 35 | const uint8_t *buf, int buf_size) | ||
| 36 | { | ||
| 37 | 18140 | AACAC3ParseContext *s = s1->priv_data; | |
| 38 | 18140 | ParseContext *pc = &s->pc; | |
| 39 | int len, i; | ||
| 40 | int new_frame_start; | ||
| 41 | 18140 | int got_frame = 0; | |
| 42 | |||
| 43 | 18140 | s1->key_frame = -1; | |
| 44 | |||
| 45 |
2/2✓ Branch 0 taken 17984 times.
✓ Branch 1 taken 156 times.
|
18140 | if (s1->flags & PARSER_FLAG_COMPLETE_FRAMES) { |
| 46 | 156 | i = buf_size; | |
| 47 | 156 | got_frame = 1; | |
| 48 | } else { | ||
| 49 | 17984 | get_next: | |
| 50 | 23810 | i=END_NOT_FOUND; | |
| 51 |
2/2✓ Branch 0 taken 19791 times.
✓ Branch 1 taken 4019 times.
|
23810 | if(s->remaining_size <= buf_size){ |
| 52 |
4/4✓ Branch 0 taken 11923 times.
✓ Branch 1 taken 7868 times.
✓ Branch 2 taken 5444 times.
✓ Branch 3 taken 6479 times.
|
19791 | if(s->remaining_size && !s->need_next_header){ |
| 53 | 5444 | i= s->remaining_size; | |
| 54 | 5444 | s->remaining_size = 0; | |
| 55 | }else{ //we need a header first | ||
| 56 | 14347 | len=0; | |
| 57 |
2/2✓ Branch 0 taken 85789 times.
✓ Branch 1 taken 2382 times.
|
88171 | for(i=s->remaining_size; i<buf_size; i++){ |
| 58 | 85789 | s->state = (s->state<<8) + buf[i]; | |
| 59 |
2/2✓ Branch 1 taken 11965 times.
✓ Branch 2 taken 73824 times.
|
85789 | if((len=s->sync(s->state, &s->need_next_header, &new_frame_start))) |
| 60 | 11965 | break; | |
| 61 | } | ||
| 62 |
2/2✓ Branch 0 taken 2382 times.
✓ Branch 1 taken 11965 times.
|
14347 | if(len<=0){ |
| 63 | 2382 | i=END_NOT_FOUND; | |
| 64 | }else{ | ||
| 65 | 11965 | got_frame = 1; | |
| 66 | 11965 | s->state=0; | |
| 67 | 11965 | i-= s->header_size -1; | |
| 68 | 11965 | s->remaining_size = len; | |
| 69 |
4/4✓ Branch 0 taken 11651 times.
✓ Branch 1 taken 314 times.
✓ Branch 2 taken 5512 times.
✓ Branch 3 taken 6139 times.
|
11965 | if(!new_frame_start || pc->index+i<=0){ |
| 70 | 5826 | s->remaining_size += i; | |
| 71 | 5826 | goto get_next; | |
| 72 | } | ||
| 73 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6139 times.
|
6139 | else if (i < 0) { |
| 74 | ✗ | s->remaining_size += i; | |
| 75 | } | ||
| 76 | } | ||
| 77 | } | ||
| 78 | } | ||
| 79 | |||
| 80 |
2/2✓ Branch 1 taken 6241 times.
✓ Branch 2 taken 11743 times.
|
17984 | if(ff_combine_frame(pc, i, &buf, &buf_size)<0){ |
| 81 | 6241 | s->remaining_size -= FFMIN(s->remaining_size, buf_size); | |
| 82 | 6241 | *poutbuf = NULL; | |
| 83 | 6241 | *poutbuf_size = 0; | |
| 84 | 6241 | return buf_size; | |
| 85 | } | ||
| 86 | } | ||
| 87 | |||
| 88 | 11899 | *poutbuf = buf; | |
| 89 | 11899 | *poutbuf_size = buf_size; | |
| 90 | |||
| 91 |
2/2✓ Branch 0 taken 11739 times.
✓ Branch 1 taken 160 times.
|
11899 | if (got_frame) { |
| 92 | int bit_rate; | ||
| 93 | |||
| 94 | /* Due to backwards compatible HE-AAC the sample rate, channel count, | ||
| 95 | and total number of samples found in an AAC ADTS header are not | ||
| 96 | reliable. Bit rate is still accurate because the total frame | ||
| 97 | duration in seconds is still correct (as is the number of bits in | ||
| 98 | the frame). */ | ||
| 99 |
2/2✓ Branch 0 taken 6208 times.
✓ Branch 1 taken 5531 times.
|
11739 | if (avctx->codec_id != AV_CODEC_ID_AAC) { |
| 100 | #if CONFIG_AC3_PARSER | ||
| 101 | 6208 | AC3HeaderInfo hdr, *phrd = &hdr; | |
| 102 | 6208 | int offset = ff_ac3_find_syncword(buf, buf_size); | |
| 103 | |||
| 104 |
2/2✓ Branch 0 taken 7 times.
✓ Branch 1 taken 6201 times.
|
6208 | if (offset < 0) |
| 105 | 11 | return i; | |
| 106 | |||
| 107 | 6201 | buf += offset; | |
| 108 | 6201 | buf_size -= offset; | |
| 109 |
1/2✓ Branch 0 taken 6514 times.
✗ Branch 1 not taken.
|
6514 | while (buf_size > 0) { |
| 110 | 6514 | int ret = avpriv_ac3_parse_header(&phrd, buf, buf_size); | |
| 111 | |||
| 112 |
4/4✓ Branch 0 taken 6513 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 6510 times.
|
6514 | if (ret < 0 || hdr.frame_size > buf_size) |
| 113 | 4 | return i; | |
| 114 | |||
| 115 |
2/2✓ Branch 0 taken 313 times.
✓ Branch 1 taken 6197 times.
|
6510 | if (buf_size > hdr.frame_size) { |
| 116 | 313 | buf += hdr.frame_size; | |
| 117 | 313 | buf_size -= hdr.frame_size; | |
| 118 | 313 | continue; | |
| 119 | } | ||
| 120 | /* Check for false positives since the syncword is not enough. | ||
| 121 | See section 6.1.2 of A/52. */ | ||
| 122 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6197 times.
|
6197 | if (av_crc(s->crc_ctx, 0, buf + 2, hdr.frame_size - 2)) |
| 123 | ✗ | return i; | |
| 124 | 6197 | break; | |
| 125 | } | ||
| 126 | |||
| 127 | 6197 | avctx->sample_rate = hdr.sample_rate; | |
| 128 | |||
| 129 |
2/2✓ Branch 0 taken 4592 times.
✓ Branch 1 taken 1605 times.
|
6197 | if (hdr.bitstream_id > 10) |
| 130 | 4592 | avctx->codec_id = AV_CODEC_ID_EAC3; | |
| 131 | |||
| 132 |
2/2✓ Branch 0 taken 1605 times.
✓ Branch 1 taken 4592 times.
|
6197 | if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) { |
| 133 | 1605 | av_channel_layout_uninit(&avctx->ch_layout); | |
| 134 |
1/2✓ Branch 0 taken 1605 times.
✗ Branch 1 not taken.
|
1605 | if (hdr.channel_layout) { |
| 135 | 1605 | av_channel_layout_from_mask(&avctx->ch_layout, hdr.channel_layout); | |
| 136 | } else { | ||
| 137 | ✗ | avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC; | |
| 138 | ✗ | avctx->ch_layout.nb_channels = hdr.channels; | |
| 139 | } | ||
| 140 | } | ||
| 141 | 6197 | s1->duration = hdr.num_blocks * 256; | |
| 142 | 6197 | avctx->audio_service_type = hdr.bitstream_mode; | |
| 143 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 6197 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6197 | if (hdr.bitstream_mode == 0x7 && hdr.channels > 1) |
| 144 | ✗ | avctx->audio_service_type = AV_AUDIO_SERVICE_TYPE_KARAOKE; | |
| 145 | 6197 | bit_rate = hdr.bit_rate; | |
| 146 | #endif | ||
| 147 | } else { | ||
| 148 | #if CONFIG_AAC_PARSER | ||
| 149 | AACADTSHeaderInfo hdr; | ||
| 150 | |||
| 151 |
3/4✓ Branch 0 taken 5530 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5530 times.
|
11061 | if (buf_size < AV_AAC_ADTS_HEADER_SIZE || |
| 152 | 5530 | ff_adts_header_parse_buf(buf, &hdr) < 0) | |
| 153 | 1 | return i; | |
| 154 | |||
| 155 |
2/2✓ Branch 0 taken 31 times.
✓ Branch 1 taken 5499 times.
|
5530 | if (avctx->profile == AV_PROFILE_UNKNOWN) |
| 156 | 31 | avctx->profile = hdr.object_type - 1; | |
| 157 | /* ADTS does not support USAC */ | ||
| 158 | 5530 | s1->key_frame = 1; | |
| 159 | 5530 | bit_rate = hdr.bit_rate; | |
| 160 | #endif | ||
| 161 | } | ||
| 162 | |||
| 163 | /* Calculate the average bit rate */ | ||
| 164 | 11727 | s->frame_number++; | |
| 165 |
2/2✓ Branch 0 taken 7135 times.
✓ Branch 1 taken 4592 times.
|
11727 | if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) { |
| 166 | 7135 | avctx->bit_rate += | |
| 167 | 7135 | (bit_rate - avctx->bit_rate) / s->frame_number; | |
| 168 | } | ||
| 169 | } | ||
| 170 | |||
| 171 | 11887 | return i; | |
| 172 | } | ||
| 173 |