aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/avformat_internal.h
blob: b114dba659cbdbbf43d9f2a1100ef6e1b9b768e6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/*
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/*
 * APIs internal to the generic avformat layer.
 *
 * MUST NOT be included by individual muxers or demuxers.
 */

#ifndef AVFORMAT_AVFORMAT_INTERNAL_H
#define AVFORMAT_AVFORMAT_INTERNAL_H

#include <stdint.h>

#include "avformat.h"
#include "internal.h"

typedef struct FormatContextInternal {
    FFFormatContext fc;

    union {
        // muxing only
        struct {
            /**
             * Whether or not avformat_init_output has already been called
             */
            int initialized;

            /**
             * Whether or not avformat_init_output fully initialized streams
             */
            int streams_initialized;


            /**
             * Number of streams relevant for interleaving.
             * Muxing only.
             */
            int nb_interleaved_streams;

            /**
             * The interleavement function in use. Always set.
             */
            int (*interleave_packet)(struct AVFormatContext *s, AVPacket *pkt,
                                     int flush, int has_packet);

#if FF_API_COMPUTE_PKT_FIELDS2
            int missing_ts_warning;
#endif
        };

        // demuxing only
        struct {
            /**
             * Raw packets from the demuxer, prior to parsing and decoding.
             * This buffer is used for buffering packets until the codec can
             * be identified, as parsing cannot be done without knowing the
             * codec.
             */
            PacketList raw_packet_buffer;

            /**
             * Sum of the size of packets in raw_packet_buffer, in bytes.
             */
            int raw_packet_buffer_size;

            /**
             * Packets split by the parser get queued here.
             */
            PacketList parse_queue;

            /**
             * Contexts and child contexts do not contain a metadata option
             */
            int metafree;

            /**
             * Set if chapter ids are strictly monotonic.
             */
            int chapter_ids_monotonic;
        };
    };

#if FF_API_LAVF_SHORTEST
    /**
     * Timestamp of the end of the shortest stream.
     */
    int64_t shortest_end;
#endif
} FormatContextInternal;

static av_always_inline FormatContextInternal *ff_fc_internal(AVFormatContext *s)
{
    return (FormatContextInternal*)s;
}

#define RELATIVE_TS_BASE (INT64_MAX - (1LL << 48))

static av_always_inline int is_relative(int64_t ts)
{
    return ts > (RELATIVE_TS_BASE - (1LL << 48));
}

/**
 * Wrap a given time stamp, if there is an indication for an overflow
 *
 * @param st stream
 * @param timestamp the time stamp to wrap
 * @return resulting time stamp
 */
int64_t ff_wrap_timestamp(const AVStream *st, int64_t timestamp);

typedef struct FFStreamGroup {
    /**
     * The public context.
     */
    AVStreamGroup pub;

    AVFormatContext *fmtctx;
} FFStreamGroup;

static av_always_inline FFStreamGroup *ffstreamgroup(AVStreamGroup *stg)
{
    return (FFStreamGroup*)stg;
}

static av_always_inline const FFStreamGroup *cffstreamgroup(const AVStreamGroup *stg)
{
    return (const FFStreamGroup*)stg;
}

void ff_flush_packet_queue(AVFormatContext *s);

const struct AVCodec *ff_find_decoder(AVFormatContext *s, const AVStream *st,
                                      enum AVCodecID codec_id);

/**
 * Frees a stream without modifying the corresponding AVFormatContext.
 * Must only be called if the latter doesn't matter or if the stream
 * is not yet attached to an AVFormatContext.
 */
void ff_free_stream(AVStream **st);

/**
 * Frees a stream group without modifying the corresponding AVFormatContext.
 * Must only be called if the latter doesn't matter or if the stream
 * is not yet attached to an AVFormatContext.
 */
void ff_free_stream_group(AVStreamGroup **pstg);

int ff_is_intra_only(enum AVCodecID id);

struct FFOutputFormat;
struct FFInputFormat;
void avpriv_register_devices(const struct FFOutputFormat * const o[],
                             const struct FFInputFormat * const i[]);

#endif // AVFORMAT_AVFORMAT_INTERNAL_H