aboutsummaryrefslogtreecommitdiffstats
path: root/fftools/ffmpeg_mux.h
blob: f41f2c18fabbfc2b026c739551da2c1389859cc1 (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
/*
 * Muxer internal APIs - should not be included outside of ffmpeg_mux*
 *
 * 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
 */

#ifndef FFTOOLS_FFMPEG_MUX_H
#define FFTOOLS_FFMPEG_MUX_H

#include <stdatomic.h>
#include <stdint.h>

#include "ffmpeg_sched.h"

#include "libavformat/avformat.h"

#include "libavcodec/packet.h"

#include "libavutil/dict.h"
#include "libavutil/fifo.h"

typedef struct MuxStream {
    OutputStream    ost;

    /**
     * Codec parameters for packets submitted to the muxer (i.e. before
     * bitstream filtering, if any).
     */
    AVCodecParameters *par_in;

    // name used for logging
    char            log_name[32];

    AVBSFContext   *bsf_ctx;
    AVPacket       *bsf_pkt;

    AVPacket       *pkt;

    EncStats        stats;

    int             sch_idx;
    int             sch_idx_enc;
    int             sch_idx_src;

    int             sq_idx_mux;

    int64_t         max_frames;

    // timestamp from which the streamcopied streams should start,
    // in AV_TIME_BASE_Q;
    // everything before it should be discarded
    int64_t         ts_copy_start;

    /* dts of the last packet sent to the muxer, in the stream timebase
     * used for making up missing dts values */
    int64_t         last_mux_dts;

    int64_t         stream_duration;
    AVRational      stream_duration_tb;

    // state for av_rescale_delta() call for audio in write_packet()
    int64_t         ts_rescale_delta_last;

    // combined size of all the packets sent to the muxer
    uint64_t        data_size_mux;

    int             copy_initial_nonkeyframes;
    int             copy_prior_start;
    int             streamcopy_started;
#if FFMPEG_OPT_VSYNC_DROP
    int             ts_drop;
#endif

    AVRational      frame_rate;
    AVRational      max_frame_rate;
    int             force_fps;

    const char     *apad;
} MuxStream;

typedef struct Muxer {
    OutputFile              of;

    // name used for logging
    char                    log_name[32];

    AVFormatContext        *fc;

    Scheduler              *sch;
    unsigned                sch_idx;

    // OutputStream indices indexed by scheduler stream indices
    int                    *sch_stream_idx;
    int                  nb_sch_stream_idx;

    AVDictionary           *opts;

    // used to validate that all encoder avoptions have been actually used
    AVDictionary           *enc_opts_used;

    /* filesize limit expressed in bytes */
    int64_t                 limit_filesize;
    atomic_int_least64_t    last_filesize;
    int                     header_written;

    SyncQueue              *sq_mux;
    AVPacket               *sq_pkt;
} Muxer;

int mux_check_init(void *arg);

static MuxStream *ms_from_ost(OutputStream *ost)
{
    return (MuxStream*)ost;
}

#endif /* FFTOOLS_FFMPEG_MUX_H */