[Libav-user] Problem with using libavcodec with AV_CODEC_ID_H264
Harald Jordan
harald.jordan at redstream.at
Fri Feb 8 09:53:29 CET 2013
If you did not make any changes to the open_video and add_video functions of
the decoding_encoding example, it cannot work. For H264 you need to manually
define a set a of H264 private settings before opening the codec.
http://stackoverflow.com/questions/3553003/encoding-h-264-with-libavcodec-x2
64
Harry
Von: libav-user-bounces at ffmpeg.org [mailto:libav-user-bounces at ffmpeg.org] Im
Auftrag von Ashwin Chandra - SISA
Gesendet: Freitag, 08. Februar 2013 00:29
An: This list is about using libavcodec, libavformat, libavutil, libavdevice
and libavfilter.
Betreff: Re: [Libav-user] Problem with using libavcodec with
AV_CODEC_ID_H264
To be clearer, I modified the decoding_encoding.c example in ffmpeg to cause
the problem.
I basically changed the video_encode_example() to encode 1 second worth of
video and then flush the delayed frame. The code below is exactly the same
except 25 frames was replaced with 1 frame.
Now if I take this code block and duplicate it again, so that it basically
runs twice, the second avcodec_encode_video2() will hang.
/* encode 1 second of video */
for(i=0;i<1;i++) {
av_init_packet(&pkt);
pkt.data = NULL; // packet data will be allocated by the encoder
pkt.size = 0;
fflush(stdout);
/* prepare a dummy image */
/* Y */
for(y=0;y<c->height;y++) {
for(x=0;x<c->width;x++) {
frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3;
}
}
/* Cb and Cr */
for(y=0;y<c->height/2;y++) {
for(x=0;x<c->width/2;x++) {
frame->data[1][y * frame->linesize[1] + x] = 128 + y + i *
2;
frame->data[2][y * frame->linesize[2] + x] = 64 + x + i * 5;
}
}
frame->pts = i;
/* encode the image */
ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
if (ret < 0) {
fprintf(stderr, "Error encoding frame\n");
exit(1);
}
if (got_output) {
printf("Write frame %3d (size=%5d)\n", i, pkt.size);
fwrite(pkt.data, 1, pkt.size, f);
av_free_packet(&pkt);
}
}
/* get the delayed frames */
for (got_output = 1; got_output; i++) {
fflush(stdout);
ret = avcodec_encode_video2(c, &pkt, NULL, &got_output);
if (ret < 0) {
fprintf(stderr, "Error encoding frame\n");
exit(1);
}
if (got_output) {
printf("Write frame %3d (size=%5d)\n", i, pkt.size);
fwrite(pkt.data, 1, pkt.size, f);
av_free_packet(&pkt);
}
}
From: libav-user-bounces at ffmpeg.org [mailto:libav-user-bounces at ffmpeg.org]
On Behalf Of Ashwin Chandra - SISA
Sent: Thursday, February 07, 2013 3:08 PM
To: libav-user at ffmpeg.org
Subject: [Libav-user] Problem with using libavcodec with AV_CODEC_ID_H264
I have some code that takes a running stream of uncompressed video data and
encodes it using AV_CODEC_ID_H264.
The sequence I follow is
1. Call avcodec_encode_video2 on the AVFrame which contains my uncompressed
frame.
2. Call avcodec_encode_video2 again passing NULL in the AVFrame parameter.
3. Repeat 2. Until a frame arrives from the encoder.
This seems to work fine if the codec is MPEG2, but with H264, it hangs
inside avcodec_encode_video2 at step 2) on the second frame. I don't have
debug symbols and can't figure out why. Does there need to be a minimum set
of uncompressed data in the encoder before trying to flush out an encoded
frame for H264? If so, how do I know when it is safe to flush a frame?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20130208/2b8d725f/attachment.html>
More information about the Libav-user
mailing list