Update raw_logger/framereader to new new ffmpeg api (#23799)

* Update raw_logger/framereader to new new ffmpeg api

* Can be removed now

* Handled by avcodec_free_context

* handle EAGAIN and clean up
bigmodel-testing
Willem Melching 2022-02-21 16:39:32 +01:00 committed by GitHub
parent ccdf069c8c
commit 724bab8ef3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 11 deletions

View File

@ -28,7 +28,6 @@ RawLogger::RawLogger(const char* filename, int width, int height, int fps,
// TODO: respect write arg
av_register_all();
codec = avcodec_find_encoder(AV_CODEC_ID_FFVHUFF);
// codec = avcodec_find_encoder(AV_CODEC_ID_FFV1);
assert(codec);
@ -111,8 +110,6 @@ void RawLogger::encoder_close() {
int err = av_write_trailer(format_ctx);
assert(err == 0);
avcodec_close(stream->codec);
err = avio_closep(&format_ctx->pb);
assert(err == 0);
@ -155,18 +152,32 @@ int RawLogger::encode_frame(const uint8_t *y_ptr, const uint8_t *u_ptr, const ui
int ret = counter;
int got_output = 0;
int err = avcodec_encode_video2(codec_ctx, &pkt, frame, &got_output);
if (err) {
LOGE("encoding error\n");
int err = avcodec_send_frame(codec_ctx, frame);
if (ret < 0) {
LOGE("avcode_send_frame error %d", err);
ret = -1;
} else if (got_output) {
}
while (ret >= 0){
err = avcodec_receive_packet(codec_ctx, &pkt);
if (err == AVERROR_EOF) {
break;
} else if (err == AVERROR(EAGAIN)) {
// Encoder might need a few frames on startup to get started. Keep going
ret = 0;
break;
} else if (err < 0) {
LOGE("avcodec_receive_packet error %d", err);
ret = -1;
break;
}
av_packet_rescale_ts(&pkt, codec_ctx->time_base, stream->time_base);
pkt.stream_index = 0;
err = av_interleaved_write_frame(format_ctx, &pkt);
if (err < 0) {
LOGE("encoder writer error\n");
LOGE("av_interleaved_write_frame %d", err);
ret = -1;
} else {
counter++;

View File

@ -32,7 +32,7 @@ private:
std::string vid_path, lock_path;
AVCodec *codec = NULL;
const AVCodec *codec = NULL;
AVCodecContext *codec_ctx = NULL;
AVStream *stream = NULL;

View File

@ -95,7 +95,7 @@ bool FrameReader::load(const std::byte *data, size_t size, bool no_cuda, std::at
}
AVStream *video = input_ctx->streams[0];
AVCodec *decoder = avcodec_find_decoder(video->codec->codec_id);
const AVCodec *decoder = avcodec_find_decoder(video->codecpar->codec_id);
if (!decoder) return false;
decoder_ctx = avcodec_alloc_context3(decoder);