mirror of
https://github.com/mpv-player/mpv
synced 2024-12-28 01:52:19 +00:00
b74c09efbf
This replaces the two buffers (ao_chain.ao_buffer in the core, and buffer_state.buffers in the AO) with a single queue. Instead of having a byte based buffer, the queue is simply a list of audio frames, as output by the decoder. This should make dataflow simpler and reduce copying. It also attempts to simplify fill_audio_out_buffers(), the function I always hated most, because it's full of subtle and buggy logic. Unfortunately, I got assaulted by corner cases, dumb features (attempt at seamless looping, really?), and other crap, so it got pretty complicated again. fill_audio_out_buffers() is still full of subtle and buggy logic. Maybe it got worse. On the other hand, maybe there really is some progress. Who knows. Originally, the data flow parts was meant to be in f_output_chain, but due to tricky interactions with the playloop code, it's now in the dummy filter in audio.c. At least this improves the way the audio PTS is passed to the encoder in encoding mode. Now it attempts to pass frames directly, along with the pts, which should minimize timestamp problems. But to be honest, encoder mode is one big kludge that shouldn't exist in this way. This commit should be considered pre-alpha code. There are lots of bugs still hiding.
66 lines
2.1 KiB
C
66 lines
2.1 KiB
C
/*
|
|
* Muxing/encoding API; ffmpeg specific implementation is in encode_lavc.*.
|
|
*
|
|
* Copyright (C) 2011-2012 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_H
|
|
#define MPLAYER_ENCODE_H
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include "demux/demux.h"
|
|
|
|
struct mpv_global;
|
|
struct mp_log;
|
|
struct encode_lavc_context;
|
|
|
|
struct encode_opts {
|
|
char *file;
|
|
char *format;
|
|
char **fopts;
|
|
char *vcodec;
|
|
char **vopts;
|
|
char *acodec;
|
|
char **aopts;
|
|
float voffset;
|
|
float aoffset;
|
|
int rawts;
|
|
int video_first;
|
|
int audio_first;
|
|
int copy_metadata;
|
|
char **set_metadata;
|
|
char **remove_metadata;
|
|
};
|
|
|
|
// interface for player core
|
|
struct encode_lavc_context *encode_lavc_init(struct mpv_global *global);
|
|
bool encode_lavc_free(struct encode_lavc_context *ctx);
|
|
void encode_lavc_discontinuity(struct encode_lavc_context *ctx);
|
|
bool encode_lavc_showhelp(struct mp_log *log, struct encode_opts *options);
|
|
int encode_lavc_getstatus(struct encode_lavc_context *ctx, char *buf, int bufsize, float relative_position);
|
|
void encode_lavc_expect_stream(struct encode_lavc_context *ctx,
|
|
enum stream_type type);
|
|
void encode_lavc_stream_eof(struct encode_lavc_context *ctx,
|
|
enum stream_type type);
|
|
void encode_lavc_set_metadata(struct encode_lavc_context *ctx,
|
|
struct mp_tags *metadata);
|
|
bool encode_lavc_didfail(struct encode_lavc_context *ctx); // check if encoding failed
|
|
|
|
#endif
|