mirror of
https://github.com/mpv-player/mpv.git
synced 2026-05-07 20:02:49 +00:00
1fbf1e1d91
0ab3184526 introduced most of the stuff
being removed here. The idea is that when doing encoding the core should
wait until everything is initialized. This is true, but the old
implementation is overly complicated and confusing. What we need is for
both the AO to be initialized and the VO to be reconfigured for encoding
to start. Because of the way initialization works, the VO reconfig
always happens first. Changing the order in playloop would of course
break this assumption, but we can trust that nobody would arbitrarily do
that. So all that needs to be done here is that write_video should wait
until the AO is up before pushing frames. And that only applies in
encoding mode and if there is a selected audio stream in the first
place. This is a simple check.
With that in place, all of this extra junk can be dropped. We don't need
special booleans or events for the simple task of making sure the AO and
VO are both up.
111 lines
3.6 KiB
C
111 lines
3.6 KiB
C
/*
|
|
* muxing using libavformat
|
|
*
|
|
* Copyright (C) 2011 Rudolf Polzer <divVerent@xonotic.org>
|
|
*
|
|
* This file is part of mpv.
|
|
*
|
|
* mpv 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.
|
|
*
|
|
* mpv 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 mpv. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef MPLAYER_ENCODE_LAVC_H
|
|
#define MPLAYER_ENCODE_LAVC_H
|
|
|
|
|
|
#include <libavcodec/avcodec.h>
|
|
#include <libavformat/avformat.h>
|
|
#include <libavutil/avstring.h>
|
|
#include <libavutil/pixfmt.h>
|
|
#include <libavutil/opt.h>
|
|
#include <libavutil/mathematics.h>
|
|
|
|
#include "common/common.h"
|
|
#include "encode.h"
|
|
#include "osdep/threads.h"
|
|
#include "video/csputils.h"
|
|
|
|
struct encode_lavc_context {
|
|
// --- Immutable after init
|
|
struct mpv_global *global;
|
|
struct encode_opts *options;
|
|
struct mp_log *log;
|
|
struct encode_priv *priv;
|
|
const AVOutputFormat *oformat;
|
|
const char *filename;
|
|
|
|
// All entry points must be guarded with the lock. Functions called by
|
|
// the playback core lock this automatically, but ao_lavc.c and vo_lavc.c
|
|
// must lock manually before accessing state.
|
|
mp_mutex lock;
|
|
|
|
// anti discontinuity mode
|
|
double next_in_pts;
|
|
double discontinuity_pts_offset;
|
|
};
|
|
|
|
// --- interface for vo/ao drivers
|
|
|
|
// Static information after encoder init. This never changes (even if there are
|
|
// dynamic runtime changes, they have to work over AVPacket side data).
|
|
// For use in encoder_context, most fields are copied from encoder_context.encoder
|
|
// by encoder_init_codec_and_muxer().
|
|
struct encoder_stream_info {
|
|
AVRational timebase; // timebase used by the encoder (in frames/out packets)
|
|
AVCodecParameters *codecpar;
|
|
};
|
|
|
|
// The encoder parts for each stream (no muxing parts included).
|
|
// This is private to each stream.
|
|
struct encoder_context {
|
|
struct mpv_global *global;
|
|
struct encode_opts *options;
|
|
struct mp_log *log;
|
|
const AVOutputFormat *oformat;
|
|
|
|
// (avoid using this)
|
|
struct encode_lavc_context *encode_lavc_ctx;
|
|
|
|
enum stream_type type;
|
|
|
|
// (different access restrictions before/after encoder init)
|
|
struct encoder_stream_info info;
|
|
AVCodecContext *encoder;
|
|
struct mux_stream *mux_stream;
|
|
|
|
// (essentially private)
|
|
struct stream *twopass_bytebuffer;
|
|
AVPacket *pkt;
|
|
};
|
|
|
|
// Free with talloc_free(). (Keep in mind actual deinitialization requires
|
|
// sending a flush packet.)
|
|
// This can fail and return NULL.
|
|
struct encoder_context *encoder_context_alloc(struct encode_lavc_context *ctx,
|
|
enum stream_type type,
|
|
struct mp_log *log);
|
|
|
|
// After setting your codec parameters on p->encoder, you call this to "open"
|
|
// the encoder. This also initializes p->mux_stream. Returns false on failure.
|
|
bool encoder_init_codec_and_muxer(struct encoder_context *p);
|
|
|
|
// Encode the frame and write the packet. frame is ref'ed as need.
|
|
bool encoder_encode(struct encoder_context *p, AVFrame *frame);
|
|
|
|
// Return muxer timebase (only available if p->mux_stream is initialized).
|
|
AVRational encoder_get_mux_timebase_unlocked(struct encoder_context *p);
|
|
|
|
void encoder_update_log(struct mpv_global *global);
|
|
|
|
#endif
|