When open input decoder, there is an option that set how many frame will be
buffer on decoder side:
for (i = 0; i < ifmt_ctx->nb_streams; i++) {
AVStream *stream;
AVCodecContext *codec_ctx;
stream = ifmt_ctx->streams[i];
codec_ctx = stream->codec;
codec_ctx->delay = 5;
…..
Notice option delay = 5, with that option set, there’s always 5 frames buffered
even when you’ve finished decode/encode steps (at least with h264 decoder)
To disable delay, set coder_ctx->delay = 0 (correct me if I am wrong) or you
have to do something like this:
1. set a counting variable to count how many frame was left on decoder:
int skip_frame = 0;
2. Whenever decoder fail to produce frame when decoding avpacket, ++ skip_frame:
if (!got_frame): ++ skip_frame;
3. When everything is finished, do something like this:
for (int i = skip_frame; i > 0; i--) {
stream_index = packet.stream_index;
type = ifmt_ctx->streams[packet.stream_index]->codec->codec_type;
if (type == AVMEDIA_TYPE_VIDEO) {
frame = av_frame_alloc();
ret = avcodec_decode_video2(ifmt_ctx->streams[stream_index]->codec
, frame, &got_frame, &packet);
if (got_frame) {
frame->pts = av_frame_get_best_effort_timestamp(frame);
ret = filter_encode_write_frame(frame, stream_index);
av_frame_free(&frame);
if (ret < 0)
goto end;
}
}
}
That’s what I figured out after weeks working with libavcodec.
Hope this help.
--
Hung Nguyen
[email protected]<mailto:[email protected]>.vn
On Dec 5, 2014, at 5:12 AM, Hendrik Leppkes
<[email protected]<mailto:[email protected]>> wrote:
On Thu, Dec 4, 2014 at 2:31 PM, Alina lifshits
<[email protected]<mailto:[email protected]>> wrote:
Hello,
I am using avcodec decoder to decode h264 stream. I noticed that the decoder
buffers a few first frames before returning a decoded picture.
The stream is from a live source and does not contains B frames. Is there a way
to tell the decoder not to buffer frames, or maybe to buffer just 1 or 2 at
most?
Since I am working with a live video, it very important for me to keep small
latency.
To minimize latency, make sure you turn off frame-threaded decoding. You can
still use slice-threading (if your video has slices), but frame-threading has
an inherent delay.
Additionally, there is a flag to force low delay decoding, but I'm not certain
it work for H.264. You could look into that.
- Hendrik
_______________________________________________
Libav-user mailing list
[email protected]<mailto:[email protected]>
http://ffmpeg.org/mailman/listinfo/libav-user
_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user