decoder/ffmpeg: use avcodec_send_packet() and avcodec_receive_frame() on FFmpeg 3.1
This commit is contained in:
@@ -251,6 +251,54 @@ FfmpegSendFrame(Decoder &decoder, InputStream &is,
|
|||||||
codec_context.bit_rate / 1000);
|
codec_context.bit_rate / 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 37, 0)
|
||||||
|
|
||||||
|
static DecoderCommand
|
||||||
|
FfmpegReceiveFrames(Decoder &decoder, InputStream &is,
|
||||||
|
AVCodecContext &codec_context,
|
||||||
|
AVFrame &frame,
|
||||||
|
size_t &skip_bytes,
|
||||||
|
FfmpegBuffer &buffer,
|
||||||
|
bool &eof)
|
||||||
|
{
|
||||||
|
while (true) {
|
||||||
|
DecoderCommand cmd;
|
||||||
|
|
||||||
|
int err = avcodec_receive_frame(&codec_context, &frame);
|
||||||
|
switch (err) {
|
||||||
|
case 0:
|
||||||
|
cmd = FfmpegSendFrame(decoder, is, codec_context,
|
||||||
|
frame, skip_bytes,
|
||||||
|
buffer);
|
||||||
|
if (cmd != DecoderCommand::NONE)
|
||||||
|
return cmd;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AVERROR_EOF:
|
||||||
|
eof = true;
|
||||||
|
return DecoderCommand::NONE;
|
||||||
|
|
||||||
|
case AVERROR(EAGAIN):
|
||||||
|
/* need to call avcodec_send_packet() */
|
||||||
|
return DecoderCommand::NONE;
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
char msg[256];
|
||||||
|
av_strerror(err, msg, sizeof(msg));
|
||||||
|
FormatWarning(ffmpeg_domain,
|
||||||
|
"avcodec_send_packet() failed: %s",
|
||||||
|
msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return DecoderCommand::STOP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode an #AVPacket and send the resulting PCM data to the decoder
|
* Decode an #AVPacket and send the resulting PCM data to the decoder
|
||||||
* API.
|
* API.
|
||||||
@@ -283,6 +331,36 @@ ffmpeg_send_packet(Decoder &decoder, InputStream &is,
|
|||||||
stream.time_base));
|
stream.time_base));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 37, 0)
|
||||||
|
bool eof = false;
|
||||||
|
|
||||||
|
int err = avcodec_send_packet(&codec_context, &packet);
|
||||||
|
switch (err) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AVERROR_EOF:
|
||||||
|
eof = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
char msg[256];
|
||||||
|
av_strerror(err, msg, sizeof(msg));
|
||||||
|
FormatWarning(ffmpeg_domain,
|
||||||
|
"avcodec_send_packet() failed: %s", msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return DecoderCommand::NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto cmd = FfmpegReceiveFrames(decoder, is, codec_context,
|
||||||
|
frame,
|
||||||
|
skip_bytes, buffer, eof);
|
||||||
|
|
||||||
|
if (eof)
|
||||||
|
cmd = DecoderCommand::STOP;
|
||||||
|
#else
|
||||||
DecoderCommand cmd = DecoderCommand::NONE;
|
DecoderCommand cmd = DecoderCommand::NONE;
|
||||||
while (packet.size > 0 && cmd == DecoderCommand::NONE) {
|
while (packet.size > 0 && cmd == DecoderCommand::NONE) {
|
||||||
int got_frame = 0;
|
int got_frame = 0;
|
||||||
@@ -305,6 +383,7 @@ ffmpeg_send_packet(Decoder &decoder, InputStream &is,
|
|||||||
frame, skip_bytes,
|
frame, skip_bytes,
|
||||||
buffer);
|
buffer);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return cmd;
|
return cmd;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user