Coverage Report

Created: 2026-04-12 07:27

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/vlc/modules/packetizer/packetizer_helper.h
Line
Count
Source
1
/*****************************************************************************
2
 * packetizer_helper.h: Packetizer helpers
3
 *****************************************************************************
4
 * Copyright (C) 2009 Laurent Aimar
5
 *
6
 * Authors: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
7
 *
8
 * This program is free software; you can redistribute it and/or modify it
9
 * under the terms of the GNU Lesser General Public License as published by
10
 * the Free Software Foundation; either version 2.1 of the License, or
11
 * (at your option) any later version.
12
 *
13
 * This program 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
16
 * GNU Lesser General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Lesser General Public License
19
 * along with this program; if not, write to the Free Software Foundation,
20
 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21
 *****************************************************************************/
22
23
#ifndef VLC_PACKETIZER_HELPER_H_
24
#define VLC_PACKETIZER_HELPER_H_
25
26
#include <vlc_block.h>
27
28
enum
29
{
30
    STATE_NOSYNC,
31
    STATE_SYNC,
32
    STATE_HEADER,
33
    STATE_NEXT_SYNC,
34
    STATE_GET_DATA,
35
    STATE_SEND_DATA,
36
    STATE_CUSTOM_FIRST,
37
};
38
39
typedef void (*packetizer_reset_t)( void *p_private, bool b_flush );
40
typedef block_t *(*packetizer_parse_t)( void *p_private, bool *pb_ts_used, block_t * );
41
typedef block_t *(*packetizer_drain_t)( void *p_private );
42
typedef int (*packetizer_validate_t)( void *p_private, block_t * );
43
44
typedef struct
45
{
46
    int i_state;
47
    block_bytestream_t bytestream;
48
    size_t i_offset;
49
50
    int i_startcode;
51
    const uint8_t *p_startcode;
52
    block_startcode_helper_t pf_startcode_helper;
53
54
    int i_au_prepend;
55
    const uint8_t *p_au_prepend;
56
57
    unsigned i_au_min_size;
58
59
    void *p_private;
60
    packetizer_reset_t    pf_reset;
61
    packetizer_parse_t    pf_parse;
62
    packetizer_validate_t pf_validate;
63
    packetizer_drain_t    pf_drain;
64
65
} packetizer_t;
66
67
static inline void packetizer_Init( packetizer_t *p_pack,
68
                                    const uint8_t *p_startcode, int i_startcode,
69
                                    block_startcode_helper_t pf_start_helper,
70
                                    const uint8_t *p_au_prepend, int i_au_prepend,
71
                                    unsigned i_au_min_size,
72
                                    packetizer_reset_t pf_reset,
73
                                    packetizer_parse_t pf_parse,
74
                                    packetizer_validate_t pf_validate,
75
                                    packetizer_drain_t pf_drain,
76
                                    void *p_private )
77
108k
{
78
108k
    p_pack->i_state = STATE_NOSYNC;
79
108k
    block_BytestreamInit( &p_pack->bytestream );
80
108k
    p_pack->i_offset = 0;
81
82
108k
    p_pack->i_au_prepend = i_au_prepend;
83
108k
    p_pack->p_au_prepend = p_au_prepend;
84
108k
    p_pack->i_au_min_size = i_au_min_size;
85
86
108k
    p_pack->i_startcode = i_startcode;
87
108k
    p_pack->p_startcode = p_startcode;
88
108k
    p_pack->pf_startcode_helper = pf_start_helper;
89
108k
    p_pack->pf_reset = pf_reset;
90
108k
    p_pack->pf_parse = pf_parse;
91
108k
    p_pack->pf_validate = pf_validate;
92
108k
    p_pack->pf_drain = pf_drain;
93
108k
    p_pack->p_private = p_private;
94
108k
}
Unexecuted instantiation: a52.c:packetizer_Init
Unexecuted instantiation: dts.c:packetizer_Init
Unexecuted instantiation: flac.c:packetizer_Init
h264.c:packetizer_Init
Line
Count
Source
77
45.7k
{
78
45.7k
    p_pack->i_state = STATE_NOSYNC;
79
45.7k
    block_BytestreamInit( &p_pack->bytestream );
80
45.7k
    p_pack->i_offset = 0;
81
82
45.7k
    p_pack->i_au_prepend = i_au_prepend;
83
45.7k
    p_pack->p_au_prepend = p_au_prepend;
84
45.7k
    p_pack->i_au_min_size = i_au_min_size;
85
86
45.7k
    p_pack->i_startcode = i_startcode;
87
45.7k
    p_pack->p_startcode = p_startcode;
88
45.7k
    p_pack->pf_startcode_helper = pf_start_helper;
89
45.7k
    p_pack->pf_reset = pf_reset;
90
45.7k
    p_pack->pf_parse = pf_parse;
91
45.7k
    p_pack->pf_validate = pf_validate;
92
45.7k
    p_pack->pf_drain = pf_drain;
93
45.7k
    p_pack->p_private = p_private;
94
45.7k
}
hevc.c:packetizer_Init
Line
Count
Source
77
22.4k
{
78
22.4k
    p_pack->i_state = STATE_NOSYNC;
79
22.4k
    block_BytestreamInit( &p_pack->bytestream );
80
22.4k
    p_pack->i_offset = 0;
81
82
22.4k
    p_pack->i_au_prepend = i_au_prepend;
83
22.4k
    p_pack->p_au_prepend = p_au_prepend;
84
22.4k
    p_pack->i_au_min_size = i_au_min_size;
85
86
22.4k
    p_pack->i_startcode = i_startcode;
87
22.4k
    p_pack->p_startcode = p_startcode;
88
22.4k
    p_pack->pf_startcode_helper = pf_start_helper;
89
22.4k
    p_pack->pf_reset = pf_reset;
90
22.4k
    p_pack->pf_parse = pf_parse;
91
22.4k
    p_pack->pf_validate = pf_validate;
92
22.4k
    p_pack->pf_drain = pf_drain;
93
22.4k
    p_pack->p_private = p_private;
94
22.4k
}
Unexecuted instantiation: mlp.c:packetizer_Init
Unexecuted instantiation: mpeg4audio.c:packetizer_Init
mpeg4video.c:packetizer_Init
Line
Count
Source
77
5.78k
{
78
5.78k
    p_pack->i_state = STATE_NOSYNC;
79
5.78k
    block_BytestreamInit( &p_pack->bytestream );
80
5.78k
    p_pack->i_offset = 0;
81
82
5.78k
    p_pack->i_au_prepend = i_au_prepend;
83
5.78k
    p_pack->p_au_prepend = p_au_prepend;
84
5.78k
    p_pack->i_au_min_size = i_au_min_size;
85
86
5.78k
    p_pack->i_startcode = i_startcode;
87
5.78k
    p_pack->p_startcode = p_startcode;
88
5.78k
    p_pack->pf_startcode_helper = pf_start_helper;
89
5.78k
    p_pack->pf_reset = pf_reset;
90
5.78k
    p_pack->pf_parse = pf_parse;
91
5.78k
    p_pack->pf_validate = pf_validate;
92
5.78k
    p_pack->pf_drain = pf_drain;
93
5.78k
    p_pack->p_private = p_private;
94
5.78k
}
Unexecuted instantiation: mpegaudio.c:packetizer_Init
mpegvideo.c:packetizer_Init
Line
Count
Source
77
33.5k
{
78
33.5k
    p_pack->i_state = STATE_NOSYNC;
79
33.5k
    block_BytestreamInit( &p_pack->bytestream );
80
33.5k
    p_pack->i_offset = 0;
81
82
33.5k
    p_pack->i_au_prepend = i_au_prepend;
83
33.5k
    p_pack->p_au_prepend = p_au_prepend;
84
33.5k
    p_pack->i_au_min_size = i_au_min_size;
85
86
33.5k
    p_pack->i_startcode = i_startcode;
87
33.5k
    p_pack->p_startcode = p_startcode;
88
33.5k
    p_pack->pf_startcode_helper = pf_start_helper;
89
33.5k
    p_pack->pf_reset = pf_reset;
90
33.5k
    p_pack->pf_parse = pf_parse;
91
33.5k
    p_pack->pf_validate = pf_validate;
92
33.5k
    p_pack->pf_drain = pf_drain;
93
33.5k
    p_pack->p_private = p_private;
94
33.5k
}
vc1.c:packetizer_Init
Line
Count
Source
77
730
{
78
730
    p_pack->i_state = STATE_NOSYNC;
79
730
    block_BytestreamInit( &p_pack->bytestream );
80
730
    p_pack->i_offset = 0;
81
82
730
    p_pack->i_au_prepend = i_au_prepend;
83
730
    p_pack->p_au_prepend = p_au_prepend;
84
730
    p_pack->i_au_min_size = i_au_min_size;
85
86
730
    p_pack->i_startcode = i_startcode;
87
730
    p_pack->p_startcode = p_startcode;
88
730
    p_pack->pf_startcode_helper = pf_start_helper;
89
730
    p_pack->pf_reset = pf_reset;
90
730
    p_pack->pf_parse = pf_parse;
91
730
    p_pack->pf_validate = pf_validate;
92
730
    p_pack->pf_drain = pf_drain;
93
730
    p_pack->p_private = p_private;
94
730
}
mjpeg.c:packetizer_Init
Line
Count
Source
77
380
{
78
380
    p_pack->i_state = STATE_NOSYNC;
79
380
    block_BytestreamInit( &p_pack->bytestream );
80
380
    p_pack->i_offset = 0;
81
82
380
    p_pack->i_au_prepend = i_au_prepend;
83
380
    p_pack->p_au_prepend = p_au_prepend;
84
380
    p_pack->i_au_min_size = i_au_min_size;
85
86
380
    p_pack->i_startcode = i_startcode;
87
380
    p_pack->p_startcode = p_startcode;
88
380
    p_pack->pf_startcode_helper = pf_start_helper;
89
380
    p_pack->pf_reset = pf_reset;
90
380
    p_pack->pf_parse = pf_parse;
91
380
    p_pack->pf_validate = pf_validate;
92
380
    p_pack->pf_drain = pf_drain;
93
380
    p_pack->p_private = p_private;
94
380
}
95
96
static inline void packetizer_Clean( packetizer_t *p_pack )
97
108k
{
98
108k
    block_BytestreamRelease( &p_pack->bytestream );
99
108k
}
Unexecuted instantiation: a52.c:packetizer_Clean
Unexecuted instantiation: dts.c:packetizer_Clean
Unexecuted instantiation: flac.c:packetizer_Clean
h264.c:packetizer_Clean
Line
Count
Source
97
45.7k
{
98
45.7k
    block_BytestreamRelease( &p_pack->bytestream );
99
45.7k
}
hevc.c:packetizer_Clean
Line
Count
Source
97
22.4k
{
98
22.4k
    block_BytestreamRelease( &p_pack->bytestream );
99
22.4k
}
Unexecuted instantiation: mlp.c:packetizer_Clean
Unexecuted instantiation: mpeg4audio.c:packetizer_Clean
mpeg4video.c:packetizer_Clean
Line
Count
Source
97
5.78k
{
98
5.78k
    block_BytestreamRelease( &p_pack->bytestream );
99
5.78k
}
Unexecuted instantiation: mpegaudio.c:packetizer_Clean
mpegvideo.c:packetizer_Clean
Line
Count
Source
97
33.5k
{
98
33.5k
    block_BytestreamRelease( &p_pack->bytestream );
99
33.5k
}
vc1.c:packetizer_Clean
Line
Count
Source
97
730
{
98
730
    block_BytestreamRelease( &p_pack->bytestream );
99
730
}
mjpeg.c:packetizer_Clean
Line
Count
Source
97
380
{
98
380
    block_BytestreamRelease( &p_pack->bytestream );
99
380
}
100
101
static inline void packetizer_Flush( packetizer_t *p_pack )
102
0
{
103
0
    p_pack->i_state = STATE_NOSYNC;
104
0
    block_BytestreamEmpty( &p_pack->bytestream );
105
0
    p_pack->i_offset = 0;
106
0
    p_pack->pf_reset( p_pack->p_private, true );
107
0
}
Unexecuted instantiation: a52.c:packetizer_Flush
Unexecuted instantiation: dts.c:packetizer_Flush
Unexecuted instantiation: flac.c:packetizer_Flush
Unexecuted instantiation: h264.c:packetizer_Flush
Unexecuted instantiation: hevc.c:packetizer_Flush
Unexecuted instantiation: mlp.c:packetizer_Flush
Unexecuted instantiation: mpeg4audio.c:packetizer_Flush
Unexecuted instantiation: mpeg4video.c:packetizer_Flush
Unexecuted instantiation: mpegaudio.c:packetizer_Flush
Unexecuted instantiation: mpegvideo.c:packetizer_Flush
Unexecuted instantiation: vc1.c:packetizer_Flush
Unexecuted instantiation: mjpeg.c:packetizer_Flush
108
109
static block_t *packetizer_PacketizeBlock( packetizer_t *p_pack, block_t **pp_block )
110
6.61M
{
111
6.61M
    block_t *p_block = ( pp_block ) ? *pp_block : NULL;
112
113
6.61M
    if( p_block == NULL && p_pack->bytestream.p_block == NULL )
114
111k
        return NULL;
115
116
6.50M
    if( p_block && unlikely( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) )
117
228k
    {
118
228k
        block_t *p_drained = packetizer_PacketizeBlock( p_pack, NULL );
119
228k
        if( p_drained )
120
16.3k
            return p_drained;
121
122
211k
        p_pack->i_state = STATE_NOSYNC;
123
211k
        block_BytestreamEmpty( &p_pack->bytestream );
124
211k
        p_pack->i_offset = 0;
125
211k
        p_pack->pf_reset( p_pack->p_private, false );
126
211k
    }
127
128
6.48M
    if( p_block )
129
6.21M
        block_BytestreamPush( &p_pack->bytestream, p_block );
130
131
6.48M
    for( ;; )
132
71.4M
    {
133
71.4M
        bool b_used_ts;
134
71.4M
        block_t *p_pic;
135
136
71.4M
        switch( p_pack->i_state )
137
71.4M
        {
138
68.7M
        case STATE_NOSYNC:
139
            /* Find a startcode */
140
68.7M
            if( !block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
141
68.7M
                                                p_pack->p_startcode, p_pack->i_startcode,
142
68.7M
                                                p_pack->pf_startcode_helper, NULL ) )
143
68.3M
                p_pack->i_state = STATE_NEXT_SYNC;
144
145
68.7M
            if( p_pack->i_offset )
146
305k
            {
147
305k
                block_SkipBytes( &p_pack->bytestream, p_pack->i_offset );
148
305k
                p_pack->i_offset = 0;
149
305k
                block_BytestreamFlush( &p_pack->bytestream );
150
305k
            }
151
152
68.7M
            if( p_pack->i_state != STATE_NEXT_SYNC )
153
416k
                return NULL; /* Need more data */
154
155
68.3M
            p_pack->i_offset = 1; /* To find next startcode */
156
            /* fallthrough */
157
158
71.0M
        case STATE_NEXT_SYNC:
159
            /* Find the next startcode */
160
71.0M
            if( block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
161
71.0M
                                               p_pack->p_startcode, p_pack->i_startcode,
162
71.0M
                                               p_pack->pf_startcode_helper, NULL ) )
163
2.90M
            {
164
2.90M
                if( pp_block /* not flushing */ || !p_pack->bytestream.p_chain )
165
2.67M
                    return NULL; /* Need more data */
166
167
                /* When flushing and we don't find a startcode, suppose that
168
                 * the data extend up to the end */
169
232k
                p_pack->i_offset = block_BytestreamRemaining(&p_pack->bytestream);
170
232k
                if( p_pack->i_offset == 0 )
171
0
                    return NULL;
172
173
232k
                if( p_pack->i_offset <= (size_t)p_pack->i_startcode &&
174
3.10k
                    (p_pack->bytestream.p_block->i_flags & BLOCK_FLAG_AU_END) == 0 )
175
3.10k
                    return NULL;
176
232k
            }
177
178
68.3M
            block_BytestreamFlush( &p_pack->bytestream );
179
180
            /* Get the new fragment and set the pts/dts */
181
68.3M
            block_t *p_block_bytestream = p_pack->bytestream.p_block;
182
183
68.3M
            p_pic = block_Alloc( p_pack->i_offset + p_pack->i_au_prepend );
184
68.3M
            if( p_pic == NULL )
185
0
            {
186
0
                p_pack->i_state = STATE_NOSYNC;
187
0
                return NULL;
188
0
            }
189
68.3M
            p_pic->i_pts = p_block_bytestream->i_pts;
190
68.3M
            p_pic->i_dts = p_block_bytestream->i_dts;
191
192
            /* Do not wait for next sync code if notified block ends AU */
193
68.3M
            if( (p_block_bytestream->i_flags & BLOCK_FLAG_AU_END) &&
194
0
                 p_block_bytestream->i_buffer == p_pack->i_offset )
195
0
            {
196
0
                p_pic->i_flags |= BLOCK_FLAG_AU_END;
197
0
            }
198
199
68.3M
            block_GetBytes( &p_pack->bytestream, &p_pic->p_buffer[p_pack->i_au_prepend],
200
68.3M
                            p_pic->i_buffer - p_pack->i_au_prepend );
201
68.3M
            if( p_pack->i_au_prepend > 0 )
202
65.8M
                memcpy( p_pic->p_buffer, p_pack->p_au_prepend, p_pack->i_au_prepend );
203
204
68.3M
            p_pack->i_offset = 0;
205
206
            /* Parse the NAL */
207
68.3M
            if( p_pic->i_buffer < p_pack->i_au_min_size )
208
807k
            {
209
807k
                block_Release( p_pic );
210
807k
                p_pic = NULL;
211
807k
            }
212
67.5M
            else
213
67.5M
            {
214
67.5M
                p_pic = p_pack->pf_parse( p_pack->p_private, &b_used_ts, p_pic );
215
67.5M
                if( b_used_ts )
216
31.9M
                {
217
31.9M
                    p_block_bytestream->i_dts = VLC_TICK_INVALID;
218
31.9M
                    p_block_bytestream->i_pts = VLC_TICK_INVALID;
219
31.9M
                }
220
67.5M
            }
221
222
68.3M
            if( !p_pic )
223
64.9M
            {
224
64.9M
                p_pack->i_state = STATE_NOSYNC;
225
64.9M
                break;
226
64.9M
            }
227
3.42M
            if( p_pack->pf_validate( p_pack->p_private, p_pic ) )
228
28.9k
            {
229
28.9k
                p_pack->i_state = STATE_NOSYNC;
230
28.9k
                block_Release( p_pic );
231
28.9k
                break;
232
28.9k
            }
233
234
            /* So p_block doesn't get re-added several times */
235
3.39M
            if( pp_block )
236
3.37M
                *pp_block = block_BytestreamPop( &p_pack->bytestream );
237
238
3.39M
            p_pack->i_state = STATE_NOSYNC;
239
240
3.39M
            return p_pic;
241
71.4M
        }
242
71.4M
    }
243
6.48M
}
Unexecuted instantiation: a52.c:packetizer_PacketizeBlock
Unexecuted instantiation: dts.c:packetizer_PacketizeBlock
Unexecuted instantiation: flac.c:packetizer_PacketizeBlock
h264.c:packetizer_PacketizeBlock
Line
Count
Source
110
1.36M
{
111
1.36M
    block_t *p_block = ( pp_block ) ? *pp_block : NULL;
112
113
1.36M
    if( p_block == NULL && p_pack->bytestream.p_block == NULL )
114
71.9k
        return NULL;
115
116
1.29M
    if( p_block && unlikely( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) )
117
171k
    {
118
171k
        block_t *p_drained = packetizer_PacketizeBlock( p_pack, NULL );
119
171k
        if( p_drained )
120
15.9k
            return p_drained;
121
122
155k
        p_pack->i_state = STATE_NOSYNC;
123
155k
        block_BytestreamEmpty( &p_pack->bytestream );
124
155k
        p_pack->i_offset = 0;
125
155k
        p_pack->pf_reset( p_pack->p_private, false );
126
155k
    }
127
128
1.27M
    if( p_block )
129
1.09M
        block_BytestreamPush( &p_pack->bytestream, p_block );
130
131
1.27M
    for( ;; )
132
4.37M
    {
133
4.37M
        bool b_used_ts;
134
4.37M
        block_t *p_pic;
135
136
4.37M
        switch( p_pack->i_state )
137
4.37M
        {
138
3.90M
        case STATE_NOSYNC:
139
            /* Find a startcode */
140
3.90M
            if( !block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
141
3.90M
                                                p_pack->p_startcode, p_pack->i_startcode,
142
3.90M
                                                p_pack->pf_startcode_helper, NULL ) )
143
3.68M
                p_pack->i_state = STATE_NEXT_SYNC;
144
145
3.90M
            if( p_pack->i_offset )
146
133k
            {
147
133k
                block_SkipBytes( &p_pack->bytestream, p_pack->i_offset );
148
133k
                p_pack->i_offset = 0;
149
133k
                block_BytestreamFlush( &p_pack->bytestream );
150
133k
            }
151
152
3.90M
            if( p_pack->i_state != STATE_NEXT_SYNC )
153
222k
                return NULL; /* Need more data */
154
155
3.68M
            p_pack->i_offset = 1; /* To find next startcode */
156
            /* fallthrough */
157
158
4.15M
        case STATE_NEXT_SYNC:
159
            /* Find the next startcode */
160
4.15M
            if( block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
161
4.15M
                                               p_pack->p_startcode, p_pack->i_startcode,
162
4.15M
                                               p_pack->pf_startcode_helper, NULL ) )
163
622k
            {
164
622k
                if( pp_block /* not flushing */ || !p_pack->bytestream.p_chain )
165
472k
                    return NULL; /* Need more data */
166
167
                /* When flushing and we don't find a startcode, suppose that
168
                 * the data extend up to the end */
169
150k
                p_pack->i_offset = block_BytestreamRemaining(&p_pack->bytestream);
170
150k
                if( p_pack->i_offset == 0 )
171
0
                    return NULL;
172
173
150k
                if( p_pack->i_offset <= (size_t)p_pack->i_startcode &&
174
1.48k
                    (p_pack->bytestream.p_block->i_flags & BLOCK_FLAG_AU_END) == 0 )
175
1.48k
                    return NULL;
176
150k
            }
177
178
3.68M
            block_BytestreamFlush( &p_pack->bytestream );
179
180
            /* Get the new fragment and set the pts/dts */
181
3.68M
            block_t *p_block_bytestream = p_pack->bytestream.p_block;
182
183
3.68M
            p_pic = block_Alloc( p_pack->i_offset + p_pack->i_au_prepend );
184
3.68M
            if( p_pic == NULL )
185
0
            {
186
0
                p_pack->i_state = STATE_NOSYNC;
187
0
                return NULL;
188
0
            }
189
3.68M
            p_pic->i_pts = p_block_bytestream->i_pts;
190
3.68M
            p_pic->i_dts = p_block_bytestream->i_dts;
191
192
            /* Do not wait for next sync code if notified block ends AU */
193
3.68M
            if( (p_block_bytestream->i_flags & BLOCK_FLAG_AU_END) &&
194
0
                 p_block_bytestream->i_buffer == p_pack->i_offset )
195
0
            {
196
0
                p_pic->i_flags |= BLOCK_FLAG_AU_END;
197
0
            }
198
199
3.68M
            block_GetBytes( &p_pack->bytestream, &p_pic->p_buffer[p_pack->i_au_prepend],
200
3.68M
                            p_pic->i_buffer - p_pack->i_au_prepend );
201
3.68M
            if( p_pack->i_au_prepend > 0 )
202
3.68M
                memcpy( p_pic->p_buffer, p_pack->p_au_prepend, p_pack->i_au_prepend );
203
204
3.68M
            p_pack->i_offset = 0;
205
206
            /* Parse the NAL */
207
3.68M
            if( p_pic->i_buffer < p_pack->i_au_min_size )
208
17.0k
            {
209
17.0k
                block_Release( p_pic );
210
17.0k
                p_pic = NULL;
211
17.0k
            }
212
3.66M
            else
213
3.66M
            {
214
3.66M
                p_pic = p_pack->pf_parse( p_pack->p_private, &b_used_ts, p_pic );
215
3.66M
                if( b_used_ts )
216
2.17M
                {
217
2.17M
                    p_block_bytestream->i_dts = VLC_TICK_INVALID;
218
2.17M
                    p_block_bytestream->i_pts = VLC_TICK_INVALID;
219
2.17M
                }
220
3.66M
            }
221
222
3.68M
            if( !p_pic )
223
3.10M
            {
224
3.10M
                p_pack->i_state = STATE_NOSYNC;
225
3.10M
                break;
226
3.10M
            }
227
581k
            if( p_pack->pf_validate( p_pack->p_private, p_pic ) )
228
0
            {
229
0
                p_pack->i_state = STATE_NOSYNC;
230
0
                block_Release( p_pic );
231
0
                break;
232
0
            }
233
234
            /* So p_block doesn't get re-added several times */
235
581k
            if( pp_block )
236
561k
                *pp_block = block_BytestreamPop( &p_pack->bytestream );
237
238
581k
            p_pack->i_state = STATE_NOSYNC;
239
240
581k
            return p_pic;
241
4.37M
        }
242
4.37M
    }
243
1.27M
}
hevc.c:packetizer_PacketizeBlock
Line
Count
Source
110
4.29M
{
111
4.29M
    block_t *p_block = ( pp_block ) ? *pp_block : NULL;
112
113
4.29M
    if( p_block == NULL && p_pack->bytestream.p_block == NULL )
114
2.33k
        return NULL;
115
116
4.29M
    if( p_block && unlikely( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) )
117
350
    {
118
350
        block_t *p_drained = packetizer_PacketizeBlock( p_pack, NULL );
119
350
        if( p_drained )
120
0
            return p_drained;
121
122
350
        p_pack->i_state = STATE_NOSYNC;
123
350
        block_BytestreamEmpty( &p_pack->bytestream );
124
350
        p_pack->i_offset = 0;
125
350
        p_pack->pf_reset( p_pack->p_private, false );
126
350
    }
127
128
4.29M
    if( p_block )
129
4.26M
        block_BytestreamPush( &p_pack->bytestream, p_block );
130
131
4.29M
    for( ;; )
132
63.8M
    {
133
63.8M
        bool b_used_ts;
134
63.8M
        block_t *p_pic;
135
136
63.8M
        switch( p_pack->i_state )
137
63.8M
        {
138
62.2M
        case STATE_NOSYNC:
139
            /* Find a startcode */
140
62.2M
            if( !block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
141
62.2M
                                                p_pack->p_startcode, p_pack->i_startcode,
142
62.2M
                                                p_pack->pf_startcode_helper, NULL ) )
143
62.1M
                p_pack->i_state = STATE_NEXT_SYNC;
144
145
62.2M
            if( p_pack->i_offset )
146
43.1k
            {
147
43.1k
                block_SkipBytes( &p_pack->bytestream, p_pack->i_offset );
148
43.1k
                p_pack->i_offset = 0;
149
43.1k
                block_BytestreamFlush( &p_pack->bytestream );
150
43.1k
            }
151
152
62.2M
            if( p_pack->i_state != STATE_NEXT_SYNC )
153
50.5k
                return NULL; /* Need more data */
154
155
62.1M
            p_pack->i_offset = 1; /* To find next startcode */
156
            /* fallthrough */
157
158
63.7M
        case STATE_NEXT_SYNC:
159
            /* Find the next startcode */
160
63.7M
            if( block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
161
63.7M
                                               p_pack->p_startcode, p_pack->i_startcode,
162
63.7M
                                               p_pack->pf_startcode_helper, NULL ) )
163
1.59M
            {
164
1.59M
                if( pp_block /* not flushing */ || !p_pack->bytestream.p_chain )
165
1.57M
                    return NULL; /* Need more data */
166
167
                /* When flushing and we don't find a startcode, suppose that
168
                 * the data extend up to the end */
169
24.1k
                p_pack->i_offset = block_BytestreamRemaining(&p_pack->bytestream);
170
24.1k
                if( p_pack->i_offset == 0 )
171
0
                    return NULL;
172
173
24.1k
                if( p_pack->i_offset <= (size_t)p_pack->i_startcode &&
174
663
                    (p_pack->bytestream.p_block->i_flags & BLOCK_FLAG_AU_END) == 0 )
175
663
                    return NULL;
176
24.1k
            }
177
178
62.1M
            block_BytestreamFlush( &p_pack->bytestream );
179
180
            /* Get the new fragment and set the pts/dts */
181
62.1M
            block_t *p_block_bytestream = p_pack->bytestream.p_block;
182
183
62.1M
            p_pic = block_Alloc( p_pack->i_offset + p_pack->i_au_prepend );
184
62.1M
            if( p_pic == NULL )
185
0
            {
186
0
                p_pack->i_state = STATE_NOSYNC;
187
0
                return NULL;
188
0
            }
189
62.1M
            p_pic->i_pts = p_block_bytestream->i_pts;
190
62.1M
            p_pic->i_dts = p_block_bytestream->i_dts;
191
192
            /* Do not wait for next sync code if notified block ends AU */
193
62.1M
            if( (p_block_bytestream->i_flags & BLOCK_FLAG_AU_END) &&
194
0
                 p_block_bytestream->i_buffer == p_pack->i_offset )
195
0
            {
196
0
                p_pic->i_flags |= BLOCK_FLAG_AU_END;
197
0
            }
198
199
62.1M
            block_GetBytes( &p_pack->bytestream, &p_pic->p_buffer[p_pack->i_au_prepend],
200
62.1M
                            p_pic->i_buffer - p_pack->i_au_prepend );
201
62.1M
            if( p_pack->i_au_prepend > 0 )
202
62.1M
                memcpy( p_pic->p_buffer, p_pack->p_au_prepend, p_pack->i_au_prepend );
203
204
62.1M
            p_pack->i_offset = 0;
205
206
            /* Parse the NAL */
207
62.1M
            if( p_pic->i_buffer < p_pack->i_au_min_size )
208
766k
            {
209
766k
                block_Release( p_pic );
210
766k
                p_pic = NULL;
211
766k
            }
212
61.4M
            else
213
61.4M
            {
214
61.4M
                p_pic = p_pack->pf_parse( p_pack->p_private, &b_used_ts, p_pic );
215
61.4M
                if( b_used_ts )
216
29.6M
                {
217
29.6M
                    p_block_bytestream->i_dts = VLC_TICK_INVALID;
218
29.6M
                    p_block_bytestream->i_pts = VLC_TICK_INVALID;
219
29.6M
                }
220
61.4M
            }
221
222
62.1M
            if( !p_pic )
223
59.5M
            {
224
59.5M
                p_pack->i_state = STATE_NOSYNC;
225
59.5M
                break;
226
59.5M
            }
227
2.66M
            if( p_pack->pf_validate( p_pack->p_private, p_pic ) )
228
0
            {
229
0
                p_pack->i_state = STATE_NOSYNC;
230
0
                block_Release( p_pic );
231
0
                break;
232
0
            }
233
234
            /* So p_block doesn't get re-added several times */
235
2.66M
            if( pp_block )
236
2.66M
                *pp_block = block_BytestreamPop( &p_pack->bytestream );
237
238
2.66M
            p_pack->i_state = STATE_NOSYNC;
239
240
2.66M
            return p_pic;
241
63.8M
        }
242
63.8M
    }
243
4.29M
}
Unexecuted instantiation: mlp.c:packetizer_PacketizeBlock
Unexecuted instantiation: mpeg4audio.c:packetizer_PacketizeBlock
mpeg4video.c:packetizer_PacketizeBlock
Line
Count
Source
110
146k
{
111
146k
    block_t *p_block = ( pp_block ) ? *pp_block : NULL;
112
113
146k
    if( p_block == NULL && p_pack->bytestream.p_block == NULL )
114
5.99k
        return NULL;
115
116
140k
    if( p_block && unlikely( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) )
117
26.0k
    {
118
26.0k
        block_t *p_drained = packetizer_PacketizeBlock( p_pack, NULL );
119
26.0k
        if( p_drained )
120
277
            return p_drained;
121
122
25.7k
        p_pack->i_state = STATE_NOSYNC;
123
25.7k
        block_BytestreamEmpty( &p_pack->bytestream );
124
25.7k
        p_pack->i_offset = 0;
125
25.7k
        p_pack->pf_reset( p_pack->p_private, false );
126
25.7k
    }
127
128
139k
    if( p_block )
129
113k
        block_BytestreamPush( &p_pack->bytestream, p_block );
130
131
139k
    for( ;; )
132
545k
    {
133
545k
        bool b_used_ts;
134
545k
        block_t *p_pic;
135
136
545k
        switch( p_pack->i_state )
137
545k
        {
138
452k
        case STATE_NOSYNC:
139
            /* Find a startcode */
140
452k
            if( !block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
141
452k
                                                p_pack->p_startcode, p_pack->i_startcode,
142
452k
                                                p_pack->pf_startcode_helper, NULL ) )
143
411k
                p_pack->i_state = STATE_NEXT_SYNC;
144
145
452k
            if( p_pack->i_offset )
146
38.3k
            {
147
38.3k
                block_SkipBytes( &p_pack->bytestream, p_pack->i_offset );
148
38.3k
                p_pack->i_offset = 0;
149
38.3k
                block_BytestreamFlush( &p_pack->bytestream );
150
38.3k
            }
151
152
452k
            if( p_pack->i_state != STATE_NEXT_SYNC )
153
41.5k
                return NULL; /* Need more data */
154
155
411k
            p_pack->i_offset = 1; /* To find next startcode */
156
            /* fallthrough */
157
158
504k
        case STATE_NEXT_SYNC:
159
            /* Find the next startcode */
160
504k
            if( block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
161
504k
                                               p_pack->p_startcode, p_pack->i_startcode,
162
504k
                                               p_pack->pf_startcode_helper, NULL ) )
163
117k
            {
164
117k
                if( pp_block /* not flushing */ || !p_pack->bytestream.p_chain )
165
92.9k
                    return NULL; /* Need more data */
166
167
                /* When flushing and we don't find a startcode, suppose that
168
                 * the data extend up to the end */
169
25.0k
                p_pack->i_offset = block_BytestreamRemaining(&p_pack->bytestream);
170
25.0k
                if( p_pack->i_offset == 0 )
171
0
                    return NULL;
172
173
25.0k
                if( p_pack->i_offset <= (size_t)p_pack->i_startcode &&
174
431
                    (p_pack->bytestream.p_block->i_flags & BLOCK_FLAG_AU_END) == 0 )
175
431
                    return NULL;
176
25.0k
            }
177
178
410k
            block_BytestreamFlush( &p_pack->bytestream );
179
180
            /* Get the new fragment and set the pts/dts */
181
410k
            block_t *p_block_bytestream = p_pack->bytestream.p_block;
182
183
410k
            p_pic = block_Alloc( p_pack->i_offset + p_pack->i_au_prepend );
184
410k
            if( p_pic == NULL )
185
0
            {
186
0
                p_pack->i_state = STATE_NOSYNC;
187
0
                return NULL;
188
0
            }
189
410k
            p_pic->i_pts = p_block_bytestream->i_pts;
190
410k
            p_pic->i_dts = p_block_bytestream->i_dts;
191
192
            /* Do not wait for next sync code if notified block ends AU */
193
410k
            if( (p_block_bytestream->i_flags & BLOCK_FLAG_AU_END) &&
194
0
                 p_block_bytestream->i_buffer == p_pack->i_offset )
195
0
            {
196
0
                p_pic->i_flags |= BLOCK_FLAG_AU_END;
197
0
            }
198
199
410k
            block_GetBytes( &p_pack->bytestream, &p_pic->p_buffer[p_pack->i_au_prepend],
200
410k
                            p_pic->i_buffer - p_pack->i_au_prepend );
201
410k
            if( p_pack->i_au_prepend > 0 )
202
0
                memcpy( p_pic->p_buffer, p_pack->p_au_prepend, p_pack->i_au_prepend );
203
204
410k
            p_pack->i_offset = 0;
205
206
            /* Parse the NAL */
207
410k
            if( p_pic->i_buffer < p_pack->i_au_min_size )
208
5.09k
            {
209
5.09k
                block_Release( p_pic );
210
5.09k
                p_pic = NULL;
211
5.09k
            }
212
405k
            else
213
405k
            {
214
405k
                p_pic = p_pack->pf_parse( p_pack->p_private, &b_used_ts, p_pic );
215
405k
                if( b_used_ts )
216
1.34k
                {
217
1.34k
                    p_block_bytestream->i_dts = VLC_TICK_INVALID;
218
1.34k
                    p_block_bytestream->i_pts = VLC_TICK_INVALID;
219
1.34k
                }
220
405k
            }
221
222
410k
            if( !p_pic )
223
405k
            {
224
405k
                p_pack->i_state = STATE_NOSYNC;
225
405k
                break;
226
405k
            }
227
5.12k
            if( p_pack->pf_validate( p_pack->p_private, p_pic ) )
228
348
            {
229
348
                p_pack->i_state = STATE_NOSYNC;
230
348
                block_Release( p_pic );
231
348
                break;
232
348
            }
233
234
            /* So p_block doesn't get re-added several times */
235
4.77k
            if( pp_block )
236
4.28k
                *pp_block = block_BytestreamPop( &p_pack->bytestream );
237
238
4.77k
            p_pack->i_state = STATE_NOSYNC;
239
240
4.77k
            return p_pic;
241
545k
        }
242
545k
    }
243
139k
}
Unexecuted instantiation: mpegaudio.c:packetizer_PacketizeBlock
mpegvideo.c:packetizer_PacketizeBlock
Line
Count
Source
110
752k
{
111
752k
    block_t *p_block = ( pp_block ) ? *pp_block : NULL;
112
113
752k
    if( p_block == NULL && p_pack->bytestream.p_block == NULL )
114
30.9k
        return NULL;
115
116
721k
    if( p_block && unlikely( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) )
117
30.4k
    {
118
30.4k
        block_t *p_drained = packetizer_PacketizeBlock( p_pack, NULL );
119
30.4k
        if( p_drained )
120
73
            return p_drained;
121
122
30.3k
        p_pack->i_state = STATE_NOSYNC;
123
30.3k
        block_BytestreamEmpty( &p_pack->bytestream );
124
30.3k
        p_pack->i_offset = 0;
125
30.3k
        p_pack->pf_reset( p_pack->p_private, false );
126
30.3k
    }
127
128
721k
    if( p_block )
129
687k
        block_BytestreamPush( &p_pack->bytestream, p_block );
130
131
721k
    for( ;; )
132
2.54M
    {
133
2.54M
        bool b_used_ts;
134
2.54M
        block_t *p_pic;
135
136
2.54M
        switch( p_pack->i_state )
137
2.54M
        {
138
2.03M
        case STATE_NOSYNC:
139
            /* Find a startcode */
140
2.03M
            if( !block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
141
2.03M
                                                p_pack->p_startcode, p_pack->i_startcode,
142
2.03M
                                                p_pack->pf_startcode_helper, NULL ) )
143
1.95M
                p_pack->i_state = STATE_NEXT_SYNC;
144
145
2.03M
            if( p_pack->i_offset )
146
64.6k
            {
147
64.6k
                block_SkipBytes( &p_pack->bytestream, p_pack->i_offset );
148
64.6k
                p_pack->i_offset = 0;
149
64.6k
                block_BytestreamFlush( &p_pack->bytestream );
150
64.6k
            }
151
152
2.03M
            if( p_pack->i_state != STATE_NEXT_SYNC )
153
73.9k
                return NULL; /* Need more data */
154
155
1.95M
            p_pack->i_offset = 1; /* To find next startcode */
156
            /* fallthrough */
157
158
2.46M
        case STATE_NEXT_SYNC:
159
            /* Find the next startcode */
160
2.46M
            if( block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
161
2.46M
                                               p_pack->p_startcode, p_pack->i_startcode,
162
2.46M
                                               p_pack->pf_startcode_helper, NULL ) )
163
541k
            {
164
541k
                if( pp_block /* not flushing */ || !p_pack->bytestream.p_chain )
165
509k
                    return NULL; /* Need more data */
166
167
                /* When flushing and we don't find a startcode, suppose that
168
                 * the data extend up to the end */
169
32.2k
                p_pack->i_offset = block_BytestreamRemaining(&p_pack->bytestream);
170
32.2k
                if( p_pack->i_offset == 0 )
171
0
                    return NULL;
172
173
32.2k
                if( p_pack->i_offset <= (size_t)p_pack->i_startcode &&
174
513
                    (p_pack->bytestream.p_block->i_flags & BLOCK_FLAG_AU_END) == 0 )
175
513
                    return NULL;
176
32.2k
            }
177
178
1.95M
            block_BytestreamFlush( &p_pack->bytestream );
179
180
            /* Get the new fragment and set the pts/dts */
181
1.95M
            block_t *p_block_bytestream = p_pack->bytestream.p_block;
182
183
1.95M
            p_pic = block_Alloc( p_pack->i_offset + p_pack->i_au_prepend );
184
1.95M
            if( p_pic == NULL )
185
0
            {
186
0
                p_pack->i_state = STATE_NOSYNC;
187
0
                return NULL;
188
0
            }
189
1.95M
            p_pic->i_pts = p_block_bytestream->i_pts;
190
1.95M
            p_pic->i_dts = p_block_bytestream->i_dts;
191
192
            /* Do not wait for next sync code if notified block ends AU */
193
1.95M
            if( (p_block_bytestream->i_flags & BLOCK_FLAG_AU_END) &&
194
0
                 p_block_bytestream->i_buffer == p_pack->i_offset )
195
0
            {
196
0
                p_pic->i_flags |= BLOCK_FLAG_AU_END;
197
0
            }
198
199
1.95M
            block_GetBytes( &p_pack->bytestream, &p_pic->p_buffer[p_pack->i_au_prepend],
200
1.95M
                            p_pic->i_buffer - p_pack->i_au_prepend );
201
1.95M
            if( p_pack->i_au_prepend > 0 )
202
0
                memcpy( p_pic->p_buffer, p_pack->p_au_prepend, p_pack->i_au_prepend );
203
204
1.95M
            p_pack->i_offset = 0;
205
206
            /* Parse the NAL */
207
1.95M
            if( p_pic->i_buffer < p_pack->i_au_min_size )
208
14.1k
            {
209
14.1k
                block_Release( p_pic );
210
14.1k
                p_pic = NULL;
211
14.1k
            }
212
1.94M
            else
213
1.94M
            {
214
1.94M
                p_pic = p_pack->pf_parse( p_pack->p_private, &b_used_ts, p_pic );
215
1.94M
                if( b_used_ts )
216
51.5k
                {
217
51.5k
                    p_block_bytestream->i_dts = VLC_TICK_INVALID;
218
51.5k
                    p_block_bytestream->i_pts = VLC_TICK_INVALID;
219
51.5k
                }
220
1.94M
            }
221
222
1.95M
            if( !p_pic )
223
1.79M
            {
224
1.79M
                p_pack->i_state = STATE_NOSYNC;
225
1.79M
                break;
226
1.79M
            }
227
166k
            if( p_pack->pf_validate( p_pack->p_private, p_pic ) )
228
28.6k
            {
229
28.6k
                p_pack->i_state = STATE_NOSYNC;
230
28.6k
                block_Release( p_pic );
231
28.6k
                break;
232
28.6k
            }
233
234
            /* So p_block doesn't get re-added several times */
235
137k
            if( pp_block )
236
137k
                *pp_block = block_BytestreamPop( &p_pack->bytestream );
237
238
137k
            p_pack->i_state = STATE_NOSYNC;
239
240
137k
            return p_pic;
241
2.54M
        }
242
2.54M
    }
243
721k
}
vc1.c:packetizer_PacketizeBlock
Line
Count
Source
110
2.71k
{
111
2.71k
    block_t *p_block = ( pp_block ) ? *pp_block : NULL;
112
113
2.71k
    if( p_block == NULL && p_pack->bytestream.p_block == NULL )
114
6
        return NULL;
115
116
2.70k
    if( p_block && unlikely( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) )
117
3
    {
118
3
        block_t *p_drained = packetizer_PacketizeBlock( p_pack, NULL );
119
3
        if( p_drained )
120
0
            return p_drained;
121
122
3
        p_pack->i_state = STATE_NOSYNC;
123
3
        block_BytestreamEmpty( &p_pack->bytestream );
124
3
        p_pack->i_offset = 0;
125
3
        p_pack->pf_reset( p_pack->p_private, false );
126
3
    }
127
128
2.70k
    if( p_block )
129
2.04k
        block_BytestreamPush( &p_pack->bytestream, p_block );
130
131
2.70k
    for( ;; )
132
116k
    {
133
116k
        bool b_used_ts;
134
116k
        block_t *p_pic;
135
136
116k
        switch( p_pack->i_state )
137
116k
        {
138
114k
        case STATE_NOSYNC:
139
            /* Find a startcode */
140
114k
            if( !block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
141
114k
                                                p_pack->p_startcode, p_pack->i_startcode,
142
114k
                                                p_pack->pf_startcode_helper, NULL ) )
143
114k
                p_pack->i_state = STATE_NEXT_SYNC;
144
145
114k
            if( p_pack->i_offset )
146
97
            {
147
97
                block_SkipBytes( &p_pack->bytestream, p_pack->i_offset );
148
97
                p_pack->i_offset = 0;
149
97
                block_BytestreamFlush( &p_pack->bytestream );
150
97
            }
151
152
114k
            if( p_pack->i_state != STATE_NEXT_SYNC )
153
670
                return NULL; /* Need more data */
154
155
114k
            p_pack->i_offset = 1; /* To find next startcode */
156
            /* fallthrough */
157
158
115k
        case STATE_NEXT_SYNC:
159
            /* Find the next startcode */
160
115k
            if( block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
161
115k
                                               p_pack->p_startcode, p_pack->i_startcode,
162
115k
                                               p_pack->pf_startcode_helper, NULL ) )
163
2.29k
            {
164
2.29k
                if( pp_block /* not flushing */ || !p_pack->bytestream.p_chain )
165
1.66k
                    return NULL; /* Need more data */
166
167
                /* When flushing and we don't find a startcode, suppose that
168
                 * the data extend up to the end */
169
633
                p_pack->i_offset = block_BytestreamRemaining(&p_pack->bytestream);
170
633
                if( p_pack->i_offset == 0 )
171
0
                    return NULL;
172
173
633
                if( p_pack->i_offset <= (size_t)p_pack->i_startcode &&
174
11
                    (p_pack->bytestream.p_block->i_flags & BLOCK_FLAG_AU_END) == 0 )
175
11
                    return NULL;
176
633
            }
177
178
114k
            block_BytestreamFlush( &p_pack->bytestream );
179
180
            /* Get the new fragment and set the pts/dts */
181
114k
            block_t *p_block_bytestream = p_pack->bytestream.p_block;
182
183
114k
            p_pic = block_Alloc( p_pack->i_offset + p_pack->i_au_prepend );
184
114k
            if( p_pic == NULL )
185
0
            {
186
0
                p_pack->i_state = STATE_NOSYNC;
187
0
                return NULL;
188
0
            }
189
114k
            p_pic->i_pts = p_block_bytestream->i_pts;
190
114k
            p_pic->i_dts = p_block_bytestream->i_dts;
191
192
            /* Do not wait for next sync code if notified block ends AU */
193
114k
            if( (p_block_bytestream->i_flags & BLOCK_FLAG_AU_END) &&
194
0
                 p_block_bytestream->i_buffer == p_pack->i_offset )
195
0
            {
196
0
                p_pic->i_flags |= BLOCK_FLAG_AU_END;
197
0
            }
198
199
114k
            block_GetBytes( &p_pack->bytestream, &p_pic->p_buffer[p_pack->i_au_prepend],
200
114k
                            p_pic->i_buffer - p_pack->i_au_prepend );
201
114k
            if( p_pack->i_au_prepend > 0 )
202
0
                memcpy( p_pic->p_buffer, p_pack->p_au_prepend, p_pack->i_au_prepend );
203
204
114k
            p_pack->i_offset = 0;
205
206
            /* Parse the NAL */
207
114k
            if( p_pic->i_buffer < p_pack->i_au_min_size )
208
762
            {
209
762
                block_Release( p_pic );
210
762
                p_pic = NULL;
211
762
            }
212
113k
            else
213
113k
            {
214
113k
                p_pic = p_pack->pf_parse( p_pack->p_private, &b_used_ts, p_pic );
215
113k
                if( b_used_ts )
216
5.08k
                {
217
5.08k
                    p_block_bytestream->i_dts = VLC_TICK_INVALID;
218
5.08k
                    p_block_bytestream->i_pts = VLC_TICK_INVALID;
219
5.08k
                }
220
113k
            }
221
222
114k
            if( !p_pic )
223
113k
            {
224
113k
                p_pack->i_state = STATE_NOSYNC;
225
113k
                break;
226
113k
            }
227
360
            if( p_pack->pf_validate( p_pack->p_private, p_pic ) )
228
0
            {
229
0
                p_pack->i_state = STATE_NOSYNC;
230
0
                block_Release( p_pic );
231
0
                break;
232
0
            }
233
234
            /* So p_block doesn't get re-added several times */
235
360
            if( pp_block )
236
335
                *pp_block = block_BytestreamPop( &p_pack->bytestream );
237
238
360
            p_pack->i_state = STATE_NOSYNC;
239
240
360
            return p_pic;
241
116k
        }
242
116k
    }
243
2.70k
}
mjpeg.c:packetizer_PacketizeBlock
Line
Count
Source
110
53.3k
{
111
53.3k
    block_t *p_block = ( pp_block ) ? *pp_block : NULL;
112
113
53.3k
    if( p_block == NULL && p_pack->bytestream.p_block == NULL )
114
129
        return NULL;
115
116
53.2k
    if( p_block && unlikely( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) )
117
132
    {
118
132
        block_t *p_drained = packetizer_PacketizeBlock( p_pack, NULL );
119
132
        if( p_drained )
120
38
            return p_drained;
121
122
94
        p_pack->i_state = STATE_NOSYNC;
123
94
        block_BytestreamEmpty( &p_pack->bytestream );
124
94
        p_pack->i_offset = 0;
125
94
        p_pack->pf_reset( p_pack->p_private, false );
126
94
    }
127
128
53.1k
    if( p_block )
129
52.6k
        block_BytestreamPush( &p_pack->bytestream, p_block );
130
131
53.1k
    for( ;; )
132
57.2k
    {
133
57.2k
        bool b_used_ts;
134
57.2k
        block_t *p_pic;
135
136
57.2k
        switch( p_pack->i_state )
137
57.2k
        {
138
31.7k
        case STATE_NOSYNC:
139
            /* Find a startcode */
140
31.7k
            if( !block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
141
31.7k
                                                p_pack->p_startcode, p_pack->i_startcode,
142
31.7k
                                                p_pack->pf_startcode_helper, NULL ) )
143
5.07k
                p_pack->i_state = STATE_NEXT_SYNC;
144
145
31.7k
            if( p_pack->i_offset )
146
25.2k
            {
147
25.2k
                block_SkipBytes( &p_pack->bytestream, p_pack->i_offset );
148
25.2k
                p_pack->i_offset = 0;
149
25.2k
                block_BytestreamFlush( &p_pack->bytestream );
150
25.2k
            }
151
152
31.7k
            if( p_pack->i_state != STATE_NEXT_SYNC )
153
26.7k
                return NULL; /* Need more data */
154
155
5.07k
            p_pack->i_offset = 1; /* To find next startcode */
156
            /* fallthrough */
157
158
30.5k
        case STATE_NEXT_SYNC:
159
            /* Find the next startcode */
160
30.5k
            if( block_FindStartcodeFromOffset( &p_pack->bytestream, &p_pack->i_offset,
161
30.5k
                                               p_pack->p_startcode, p_pack->i_startcode,
162
30.5k
                                               p_pack->pf_startcode_helper, NULL ) )
163
25.8k
            {
164
25.8k
                if( pp_block /* not flushing */ || !p_pack->bytestream.p_chain )
165
25.5k
                    return NULL; /* Need more data */
166
167
                /* When flushing and we don't find a startcode, suppose that
168
                 * the data extend up to the end */
169
315
                p_pack->i_offset = block_BytestreamRemaining(&p_pack->bytestream);
170
315
                if( p_pack->i_offset == 0 )
171
0
                    return NULL;
172
173
315
                if( p_pack->i_offset <= (size_t)p_pack->i_startcode &&
174
2
                    (p_pack->bytestream.p_block->i_flags & BLOCK_FLAG_AU_END) == 0 )
175
2
                    return NULL;
176
315
            }
177
178
5.06k
            block_BytestreamFlush( &p_pack->bytestream );
179
180
            /* Get the new fragment and set the pts/dts */
181
5.06k
            block_t *p_block_bytestream = p_pack->bytestream.p_block;
182
183
5.06k
            p_pic = block_Alloc( p_pack->i_offset + p_pack->i_au_prepend );
184
5.06k
            if( p_pic == NULL )
185
0
            {
186
0
                p_pack->i_state = STATE_NOSYNC;
187
0
                return NULL;
188
0
            }
189
5.06k
            p_pic->i_pts = p_block_bytestream->i_pts;
190
5.06k
            p_pic->i_dts = p_block_bytestream->i_dts;
191
192
            /* Do not wait for next sync code if notified block ends AU */
193
5.06k
            if( (p_block_bytestream->i_flags & BLOCK_FLAG_AU_END) &&
194
0
                 p_block_bytestream->i_buffer == p_pack->i_offset )
195
0
            {
196
0
                p_pic->i_flags |= BLOCK_FLAG_AU_END;
197
0
            }
198
199
5.06k
            block_GetBytes( &p_pack->bytestream, &p_pic->p_buffer[p_pack->i_au_prepend],
200
5.06k
                            p_pic->i_buffer - p_pack->i_au_prepend );
201
5.06k
            if( p_pack->i_au_prepend > 0 )
202
0
                memcpy( p_pic->p_buffer, p_pack->p_au_prepend, p_pack->i_au_prepend );
203
204
5.06k
            p_pack->i_offset = 0;
205
206
            /* Parse the NAL */
207
5.06k
            if( p_pic->i_buffer < p_pack->i_au_min_size )
208
4.10k
            {
209
4.10k
                block_Release( p_pic );
210
4.10k
                p_pic = NULL;
211
4.10k
            }
212
964
            else
213
964
            {
214
964
                p_pic = p_pack->pf_parse( p_pack->p_private, &b_used_ts, p_pic );
215
964
                if( b_used_ts )
216
964
                {
217
964
                    p_block_bytestream->i_dts = VLC_TICK_INVALID;
218
964
                    p_block_bytestream->i_pts = VLC_TICK_INVALID;
219
964
                }
220
964
            }
221
222
5.06k
            if( !p_pic )
223
4.10k
            {
224
4.10k
                p_pack->i_state = STATE_NOSYNC;
225
4.10k
                break;
226
4.10k
            }
227
964
            if( p_pack->pf_validate( p_pack->p_private, p_pic ) )
228
0
            {
229
0
                p_pack->i_state = STATE_NOSYNC;
230
0
                block_Release( p_pic );
231
0
                break;
232
0
            }
233
234
            /* So p_block doesn't get re-added several times */
235
964
            if( pp_block )
236
788
                *pp_block = block_BytestreamPop( &p_pack->bytestream );
237
238
964
            p_pack->i_state = STATE_NOSYNC;
239
240
964
            return p_pic;
241
57.2k
        }
242
57.2k
    }
243
53.1k
}
244
245
static block_t *packetizer_Packetize( packetizer_t *p_pack, block_t **pp_block )
246
6.38M
{
247
6.38M
    block_t *p_out = packetizer_PacketizeBlock( p_pack, pp_block );
248
6.38M
    if( p_out )
249
3.39M
        return p_out;
250
    /* handle caller drain */
251
2.99M
    if( pp_block == NULL && p_pack->pf_drain )
252
145k
    {
253
145k
        p_out = p_pack->pf_drain( p_pack->p_private );
254
145k
        if( p_out && p_pack->pf_validate( p_pack->p_private, p_out ) )
255
2.56k
        {
256
2.56k
            block_Release( p_out );
257
2.56k
            p_out = NULL;
258
2.56k
        }
259
145k
    }
260
2.99M
    return p_out;
261
6.38M
}
Unexecuted instantiation: a52.c:packetizer_Packetize
Unexecuted instantiation: dts.c:packetizer_Packetize
Unexecuted instantiation: flac.c:packetizer_Packetize
h264.c:packetizer_Packetize
Line
Count
Source
246
1.19M
{
247
1.19M
    block_t *p_out = packetizer_PacketizeBlock( p_pack, pp_block );
248
1.19M
    if( p_out )
249
581k
        return p_out;
250
    /* handle caller drain */
251
612k
    if( pp_block == NULL && p_pack->pf_drain )
252
81.0k
    {
253
81.0k
        p_out = p_pack->pf_drain( p_pack->p_private );
254
81.0k
        if( p_out && p_pack->pf_validate( p_pack->p_private, p_out ) )
255
0
        {
256
0
            block_Release( p_out );
257
            p_out = NULL;
258
0
        }
259
81.0k
    }
260
612k
    return p_out;
261
1.19M
}
hevc.c:packetizer_Packetize
Line
Count
Source
246
4.29M
{
247
4.29M
    block_t *p_out = packetizer_PacketizeBlock( p_pack, pp_block );
248
4.29M
    if( p_out )
249
2.66M
        return p_out;
250
    /* handle caller drain */
251
1.62M
    if( pp_block == NULL && p_pack->pf_drain )
252
29.1k
    {
253
29.1k
        p_out = p_pack->pf_drain( p_pack->p_private );
254
29.1k
        if( p_out && p_pack->pf_validate( p_pack->p_private, p_out ) )
255
0
        {
256
0
            block_Release( p_out );
257
            p_out = NULL;
258
0
        }
259
29.1k
    }
260
1.62M
    return p_out;
261
4.29M
}
Unexecuted instantiation: mlp.c:packetizer_Packetize
Unexecuted instantiation: mpeg4audio.c:packetizer_Packetize
mpeg4video.c:packetizer_Packetize
Line
Count
Source
246
119k
{
247
119k
    block_t *p_out = packetizer_PacketizeBlock( p_pack, pp_block );
248
119k
    if( p_out )
249
4.77k
        return p_out;
250
    /* handle caller drain */
251
115k
    if( pp_block == NULL && p_pack->pf_drain )
252
0
    {
253
0
        p_out = p_pack->pf_drain( p_pack->p_private );
254
0
        if( p_out && p_pack->pf_validate( p_pack->p_private, p_out ) )
255
0
        {
256
0
            block_Release( p_out );
257
            p_out = NULL;
258
0
        }
259
0
    }
260
115k
    return p_out;
261
119k
}
Unexecuted instantiation: mpegaudio.c:packetizer_Packetize
mpegvideo.c:packetizer_Packetize
Line
Count
Source
246
722k
{
247
722k
    block_t *p_out = packetizer_PacketizeBlock( p_pack, pp_block );
248
722k
    if( p_out )
249
137k
        return p_out;
250
    /* handle caller drain */
251
584k
    if( pp_block == NULL && p_pack->pf_drain )
252
34.6k
    {
253
34.6k
        p_out = p_pack->pf_drain( p_pack->p_private );
254
34.6k
        if( p_out && p_pack->pf_validate( p_pack->p_private, p_out ) )
255
2.56k
        {
256
2.56k
            block_Release( p_out );
257
            p_out = NULL;
258
2.56k
        }
259
34.6k
    }
260
584k
    return p_out;
261
722k
}
vc1.c:packetizer_Packetize
Line
Count
Source
246
2.70k
{
247
2.70k
    block_t *p_out = packetizer_PacketizeBlock( p_pack, pp_block );
248
2.70k
    if( p_out )
249
360
        return p_out;
250
    /* handle caller drain */
251
2.34k
    if( pp_block == NULL && p_pack->pf_drain )
252
639
    {
253
639
        p_out = p_pack->pf_drain( p_pack->p_private );
254
639
        if( p_out && p_pack->pf_validate( p_pack->p_private, p_out ) )
255
0
        {
256
0
            block_Release( p_out );
257
            p_out = NULL;
258
0
        }
259
639
    }
260
2.34k
    return p_out;
261
2.70k
}
mjpeg.c:packetizer_Packetize
Line
Count
Source
246
53.2k
{
247
53.2k
    block_t *p_out = packetizer_PacketizeBlock( p_pack, pp_block );
248
53.2k
    if( p_out )
249
964
        return p_out;
250
    /* handle caller drain */
251
52.2k
    if( pp_block == NULL && p_pack->pf_drain )
252
0
    {
253
0
        p_out = p_pack->pf_drain( p_pack->p_private );
254
0
        if( p_out && p_pack->pf_validate( p_pack->p_private, p_out ) )
255
0
        {
256
0
            block_Release( p_out );
257
            p_out = NULL;
258
0
        }
259
0
    }
260
52.2k
    return p_out;
261
53.2k
}
262
263
static inline void packetizer_Header( packetizer_t *p_pack,
264
                                      const uint8_t *p_header, int i_header )
265
31.5k
{
266
31.5k
    block_t *p_init = block_Alloc( i_header );
267
31.5k
    if( !p_init )
268
0
        return;
269
270
31.5k
    memcpy( p_init->p_buffer, p_header, i_header );
271
272
31.5k
    block_t *p_pic;
273
31.6k
    while( ( p_pic = packetizer_Packetize( p_pack, &p_init ) ) )
274
28
        block_Release( p_pic ); /* Should not happen (only sequence header) */
275
31.6k
    while( ( p_pic = packetizer_Packetize( p_pack, NULL ) ) )
276
51
        block_Release( p_pic );
277
278
31.5k
    p_pack->i_state = STATE_NOSYNC;
279
31.5k
    block_BytestreamEmpty( &p_pack->bytestream );
280
31.5k
    p_pack->i_offset = 0;
281
31.5k
}
Unexecuted instantiation: a52.c:packetizer_Header
Unexecuted instantiation: dts.c:packetizer_Header
Unexecuted instantiation: flac.c:packetizer_Header
h264.c:packetizer_Header
Line
Count
Source
265
26.0k
{
266
26.0k
    block_t *p_init = block_Alloc( i_header );
267
26.0k
    if( !p_init )
268
0
        return;
269
270
26.0k
    memcpy( p_init->p_buffer, p_header, i_header );
271
272
26.0k
    block_t *p_pic;
273
26.0k
    while( ( p_pic = packetizer_Packetize( p_pack, &p_init ) ) )
274
0
        block_Release( p_pic ); /* Should not happen (only sequence header) */
275
26.0k
    while( ( p_pic = packetizer_Packetize( p_pack, NULL ) ) )
276
0
        block_Release( p_pic );
277
278
26.0k
    p_pack->i_state = STATE_NOSYNC;
279
26.0k
    block_BytestreamEmpty( &p_pack->bytestream );
280
26.0k
    p_pack->i_offset = 0;
281
26.0k
}
hevc.c:packetizer_Header
Line
Count
Source
265
5.47k
{
266
5.47k
    block_t *p_init = block_Alloc( i_header );
267
5.47k
    if( !p_init )
268
0
        return;
269
270
5.47k
    memcpy( p_init->p_buffer, p_header, i_header );
271
272
5.47k
    block_t *p_pic;
273
5.50k
    while( ( p_pic = packetizer_Packetize( p_pack, &p_init ) ) )
274
28
        block_Release( p_pic ); /* Should not happen (only sequence header) */
275
5.52k
    while( ( p_pic = packetizer_Packetize( p_pack, NULL ) ) )
276
51
        block_Release( p_pic );
277
278
5.47k
    p_pack->i_state = STATE_NOSYNC;
279
5.47k
    block_BytestreamEmpty( &p_pack->bytestream );
280
5.47k
    p_pack->i_offset = 0;
281
5.47k
}
Unexecuted instantiation: mlp.c:packetizer_Header
Unexecuted instantiation: mpeg4audio.c:packetizer_Header
Unexecuted instantiation: mpeg4video.c:packetizer_Header
Unexecuted instantiation: mpegaudio.c:packetizer_Header
Unexecuted instantiation: mpegvideo.c:packetizer_Header
vc1.c:packetizer_Header
Line
Count
Source
265
31
{
266
31
    block_t *p_init = block_Alloc( i_header );
267
31
    if( !p_init )
268
0
        return;
269
270
31
    memcpy( p_init->p_buffer, p_header, i_header );
271
272
31
    block_t *p_pic;
273
31
    while( ( p_pic = packetizer_Packetize( p_pack, &p_init ) ) )
274
0
        block_Release( p_pic ); /* Should not happen (only sequence header) */
275
31
    while( ( p_pic = packetizer_Packetize( p_pack, NULL ) ) )
276
0
        block_Release( p_pic );
277
278
31
    p_pack->i_state = STATE_NOSYNC;
279
31
    block_BytestreamEmpty( &p_pack->bytestream );
280
31
    p_pack->i_offset = 0;
281
31
}
Unexecuted instantiation: mjpeg.c:packetizer_Header
282
283
#endif
284