FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/gsm_parser.c
Date: 2026-01-23 19:11:46
Exec Total Coverage
Lines: 25 31 80.6%
Functions: 1 1 100.0%
Branches: 10 15 66.7%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2012 Justin Ruggles
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 /**
22 * @file
23 * GSM audio parser
24 *
25 * Splits packets into individual blocks.
26 */
27
28 #include "libavutil/avassert.h"
29 #include "parser.h"
30 #include "gsm.h"
31 #include "parser_internal.h"
32
33 typedef struct GSMParseContext {
34 ParseContext pc;
35 int block_size;
36 int duration;
37 int remaining;
38 } GSMParseContext;
39
40 90 static int gsm_parse(AVCodecParserContext *s1, AVCodecContext *avctx,
41 const uint8_t **poutbuf, int *poutbuf_size,
42 const uint8_t *buf, int buf_size)
43 {
44 90 GSMParseContext *s = s1->priv_data;
45 90 ParseContext *pc = &s->pc;
46 int next;
47
48
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 89 times.
90 if (!s->block_size) {
49
1/3
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 switch (avctx->codec_id) {
50 case AV_CODEC_ID_GSM:
51 s->block_size = GSM_BLOCK_SIZE;
52 s->duration = GSM_FRAME_SIZE;
53 break;
54 1 case AV_CODEC_ID_GSM_MS:
55 2 s->block_size = avctx->block_align ? avctx->block_align
56
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 : GSM_MS_BLOCK_SIZE;
57 1 s->duration = GSM_FRAME_SIZE * 2;
58 1 break;
59 default:
60 av_assert0(0);
61 }
62 }
63
64
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 if (!s->remaining)
65 90 s->remaining = s->block_size;
66
2/2
✓ Branch 0 taken 89 times.
✓ Branch 1 taken 1 times.
90 if (s->remaining <= buf_size) {
67 89 next = s->remaining;
68 89 s->remaining = 0;
69 } else {
70 1 next = END_NOT_FOUND;
71 1 s->remaining -= buf_size;
72 }
73
74
3/4
✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 89 times.
90 if (ff_combine_frame(pc, next, &buf, &buf_size) < 0 || !buf_size) {
75 1 *poutbuf = NULL;
76 1 *poutbuf_size = 0;
77 1 return buf_size;
78 }
79
80 89 s1->duration = s->duration;
81
82 89 *poutbuf = buf;
83 89 *poutbuf_size = buf_size;
84 89 return next;
85 }
86
87 const FFCodecParser ff_gsm_parser = {
88 PARSER_CODEC_LIST(AV_CODEC_ID_GSM, AV_CODEC_ID_GSM_MS),
89 .priv_data_size = sizeof(GSMParseContext),
90 .parse = gsm_parse,
91 .close = ff_parse_close,
92 };
93