Improve remuxer
This commit is contained in:
parent
0a10a8ba59
commit
00310b6a2c
@ -3,18 +3,22 @@
|
|||||||
|
|
||||||
#ifdef USE_FFMPEG
|
#ifdef USE_FFMPEG
|
||||||
static AVRational time_base = {1, 1000LL * 1000LL};
|
static AVRational time_base = {1, 1000LL * 1000LL};
|
||||||
static int avio_ctx_buffer_size = 4096;
|
static unsigned avio_ctx_buffer_size = 4096;
|
||||||
|
|
||||||
static int ffmpeg_remuxer_init_avcontext(AVFormatContext **context, ffmpeg_remuxer_t *remuxer, int output, int (*packet)(void *opaque, uint8_t *buf, int buf_size))
|
static int ffmpeg_remuxer_init_avcontext(AVFormatContext **context, ffmpeg_remuxer_t *remuxer, int output, int (*packet)(void *opaque, uint8_t *buf, int buf_size))
|
||||||
{
|
{
|
||||||
uint8_t *buffer = NULL;
|
uint8_t *buffer = NULL;
|
||||||
AVIOContext *avio = NULL;
|
AVIOContext *avio = NULL;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
|
unsigned buffer_size = MAX(
|
||||||
|
output ? remuxer->write_buffer_size : remuxer->read_buffer_size,
|
||||||
|
avio_ctx_buffer_size);
|
||||||
|
|
||||||
buffer = av_malloc(avio_ctx_buffer_size);
|
buffer = av_malloc(buffer_size);
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
avio = avio_alloc_context(buffer, avio_ctx_buffer_size, output, remuxer->opaque, output ? NULL : packet, output ? packet : NULL, NULL);
|
avio = avio_alloc_context(buffer, buffer_size, output, remuxer->opaque, output ? NULL : packet, output ? packet : NULL, NULL);
|
||||||
if (!avio)
|
if (!avio)
|
||||||
goto error;
|
goto error;
|
||||||
if (output && (ret = avformat_alloc_output_context2(context, NULL, remuxer->video_format, NULL)) < 0)
|
if (output && (ret = avformat_alloc_output_context2(context, NULL, remuxer->video_format, NULL)) < 0)
|
||||||
@ -112,7 +116,7 @@ int ffmpeg_remuxer_open(ffmpeg_remuxer_t *remuxer)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ffmpeg_remuxer_close(ffmpeg_remuxer_t *remuxer)
|
void ffmpeg_remuxer_close(ffmpeg_remuxer_t *remuxer)
|
||||||
{
|
{
|
||||||
if (remuxer->output_context)
|
if (remuxer->output_context)
|
||||||
av_write_trailer(remuxer->output_context);
|
av_write_trailer(remuxer->output_context);
|
||||||
@ -123,11 +127,16 @@ int ffmpeg_remuxer_close(ffmpeg_remuxer_t *remuxer)
|
|||||||
av_dict_free(&remuxer->output_opts);
|
av_dict_free(&remuxer->output_opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ffmpeg_remuxer_feed(ffmpeg_remuxer_t *remuxer)
|
int ffmpeg_remuxer_feed(ffmpeg_remuxer_t *remuxer, int nframes)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
int frames = 0;
|
||||||
|
|
||||||
while (ret >= 0) {
|
while (ret >= 0) {
|
||||||
|
if (nframes > 0 && frames >= nframes) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ret = av_read_frame(remuxer->input_context, remuxer->packet);
|
ret = av_read_frame(remuxer->input_context, remuxer->packet);
|
||||||
if (ret == AVERROR_EOF) {
|
if (ret == AVERROR_EOF) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -143,6 +152,9 @@ int ffmpeg_remuxer_feed(ffmpeg_remuxer_t *remuxer)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
remuxer->frames++;
|
||||||
|
frames++;
|
||||||
|
|
||||||
AVStream *in_stream = remuxer->input_context->streams[remuxer->packet->stream_index];
|
AVStream *in_stream = remuxer->input_context->streams[remuxer->packet->stream_index];
|
||||||
remuxer->packet->stream_index = 0;
|
remuxer->packet->stream_index = 0;
|
||||||
AVStream *out_stream = remuxer->output_context->streams[remuxer->packet->stream_index];
|
AVStream *out_stream = remuxer->output_context->streams[remuxer->packet->stream_index];
|
||||||
@ -167,6 +179,22 @@ int ffmpeg_remuxer_feed(ffmpeg_remuxer_t *remuxer)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ret >= 0) {
|
||||||
|
return frames;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ffmpeg_remuxer_flush(ffmpeg_remuxer_t *remuxer)
|
||||||
|
{
|
||||||
|
int ret = av_write_frame(remuxer->output_context, NULL);
|
||||||
|
if (ret == AVERROR_EOF) {
|
||||||
|
LOG_DEBUG(remuxer, "av_write_frame (flush): EOF", ret);
|
||||||
|
} else {
|
||||||
|
LOG_DEBUG(remuxer, "av_write_frame (flush): %08x", ret);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -175,13 +203,17 @@ int ffmpeg_remuxer_open(ffmpeg_remuxer_t *remuxer)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ffmpeg_remuxer_feed(ffmpeg_remuxer_t *remuxer)
|
int ffmpeg_remuxer_feed(ffmpeg_remuxer_t *remuxer, int nframes)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ffmpeg_remuxer_close(ffmpeg_remuxer_t *remuxer)
|
int ffmpeg_remuxer_flush(ffmpeg_remuxer_t *remuxer)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ffmpeg_remuxer_close(ffmpeg_remuxer_t *remuxer)
|
||||||
|
{
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -19,6 +19,11 @@ typedef struct ffmpeg_remuxer_s {
|
|||||||
void *opaque;
|
void *opaque;
|
||||||
ffmpeg_data_packet read_packet;
|
ffmpeg_data_packet read_packet;
|
||||||
ffmpeg_data_packet write_packet;
|
ffmpeg_data_packet write_packet;
|
||||||
|
unsigned read_buffer_size;
|
||||||
|
unsigned write_buffer_size;
|
||||||
|
|
||||||
|
uint64_t start_time;
|
||||||
|
unsigned frames;
|
||||||
|
|
||||||
#ifdef USE_FFMPEG
|
#ifdef USE_FFMPEG
|
||||||
AVIOContext *input_avio;
|
AVIOContext *input_avio;
|
||||||
@ -29,10 +34,10 @@ typedef struct ffmpeg_remuxer_s {
|
|||||||
AVPacket *packet;
|
AVPacket *packet;
|
||||||
AVDictionary *output_opts;
|
AVDictionary *output_opts;
|
||||||
int video_stream;
|
int video_stream;
|
||||||
uint64_t start_time;
|
|
||||||
#endif
|
#endif
|
||||||
} ffmpeg_remuxer_t;
|
} ffmpeg_remuxer_t;
|
||||||
|
|
||||||
int ffmpeg_remuxer_open(ffmpeg_remuxer_t *remuxer);
|
int ffmpeg_remuxer_open(ffmpeg_remuxer_t *remuxer);
|
||||||
int ffmpeg_remuxer_feed(ffmpeg_remuxer_t *remuxer);
|
int ffmpeg_remuxer_feed(ffmpeg_remuxer_t *remuxer, int nframes);
|
||||||
int ffmpeg_remuxer_close(ffmpeg_remuxer_t *remuxer);
|
int ffmpeg_remuxer_flush(ffmpeg_remuxer_t *remuxer);
|
||||||
|
void ffmpeg_remuxer_close(ffmpeg_remuxer_t *remuxer);
|
||||||
|
@ -94,7 +94,7 @@ static int http_ffmpeg_video_buf_part(buffer_lock_t *buf_lock, buffer_t *buf, in
|
|||||||
|
|
||||||
if ((ret = ffmpeg_remuxer_open(status->remuxer)) < 0)
|
if ((ret = ffmpeg_remuxer_open(status->remuxer)) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
if ((ret = ffmpeg_remuxer_feed(status->remuxer)) < 0)
|
if ((ret = ffmpeg_remuxer_feed(status->remuxer, 0)) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
ret = 1;
|
ret = 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user