[FFmpeg-trac] #3519(undetermined:new): Decoding mpegts h264 i-frame into jpeg occasionally gives gray or green images
FFmpeg
trac at avcodec.org
Tue Apr 1 23:04:55 CEST 2014
#3519: Decoding mpegts h264 i-frame into jpeg occasionally gives gray or green
images
--------------------------------------+----------------------------------
Reporter: werner | Type: defect
Status: new | Priority: normal
Component: undetermined | Version: 2.2
Keywords: | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
--------------------------------------+----------------------------------
'''Summary of the bug''': decoding mpegts h264 i-frame into jpeg
occasionally gives gray or green images.
'''FFmpeg version''':
{{{
ffmpeg version 2.2
built on Apr 1 2014 15:14:10 with gcc 4.1.2 (GCC) 20080704 (Red Hat
4.1.2-54)
configuration: --shlibdir=/usr/lib64 --prefix=/usr --mandir=/usr/share/man
--libdir=/usr/lib64 --enable-shared --disable-static --enable-debug
--disable-stripping --extra-cflags='-O2 -g -pipe -Wall
-Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-
size=4 -m64 -mtune=generic -fPIC -I/usr/include/gsm' --enable-gpl
--enable-x11grab --enable-version3 --enable-pthreads --enable-libfaac
--enable-nonfree --enable-avfilter --enable-libvpx --enable-libass
--enable-libmp3lame --enable-libvorbis --enable-libxvid --enable-libx264
--enable-libgsm --enable-libopencore-amrnb --enable-libopencore-amrwb
--enable-postproc --enable-libdc1394 --enable-libfreetype --enable-
avresample --enable-libtwolame --enable-librtmp
libavutil 52. 66.100 / 52. 66.100
libavcodec 55. 52.102 / 55. 52.102
libavformat 55. 33.100 / 55. 33.100
libavdevice 55. 10.100 / 55. 10.100
libavfilter 4. 2.100 / 4. 2.100
libavresample 1. 2. 0 / 1. 2. 0
libswscale 2. 5.102 / 2. 5.102
libswresample 0. 18.100 / 0. 18.100
libpostproc 52. 3.100 / 52. 3.100
}}}
'''How to reproduce''': I am using the c libraries to create my own
functions, and unfortunately I can't post the entire code here (I can show
how the decoder/encoder are set up, see below). I know the code works as
>90% of my videos work entirely and the rest of the videos work for most
of the frames. I understand this is most likely due to corrupt i-frames or
something with data not being there (the videos can be bad quality), and I
even try to help it out by passing more frames to it after the i-frame. I
don't necessarily expect valid images back (although if there was a way to
get the decoder to do that by passing more data or something, that would
be awesome if someone could help me down that path), but I do expect
FFmpeg to throw some sort of error my way that I can detect it had a bad
frame. I have a video clip I can upload that exhibits the behavior with
this code, but it's 118MB - I don't know if I can upload that here. I will
try after opening the bug or I can upload it somewhere else if necessary.
decoder:
{{{
AVCodec* decoder = avcodec_find_decoder(CODEC_ID_H264);
AVCodecContext* decoder_cc = avcodec_alloc_context3(decoder);
avcodec_open2(decoder_cc, decoder, NULL);
decoder_cc->flags2 |= CODEC_FLAG2_SHOW_ALL;
decoder_cc->skip_frame = AVDISCARD_BIDIR | AVDISCARD_NONREF;
//decoder_cc->err_recognition = AV_EF_CRCCHECK | AV_EF_BITSTREAM |
AV_EF_BUFFER | AV_EF_CAREFUL; // these don't seem to help
...
// Initialized packet variables, etc
// At this point, we have parsed the mpegts stream to find the video pid
and have found the sps header and it's slice data, which we then pass into
decode
ret = avcodec_decode_video2(decoder_cc, picture, &got_packet,
&decoder_pkt);
// all is valid, got_packet is 1, ret > 0, and all the flags on picture
look good (no error flags set, key frame is 1, etc)
}}}
encoder:
{{{
AVFormatContext* output_stream = NULL;
avformat_alloc_output_context2(&output_stream, NULL, "image2", NULL);
AVCodec* encoder = avcodec_find_encoder(CODEC_ID_MJPEG);
AVStream* video_stream;
video_stream = avformat_new_stream(output_stream, encoder);
video_stream->codec->codec = encoder;
video_stream->codec->qcompress = 0.8f;
video_stream->codec->width = 200; // Note: scaling happens with SwsContext
not shown here
video_stream->codec->height = 150;
video_stream->codec->time_base.num = 1;
video_stream->codec->pix_fmt = AV_PIX_FMT_YUVJ420P;
avcodec_open2(video_stream->codec, NULL, NULL);
//output_stream->pb initialized using simplified ffio_fdopen
...
// decoded picture is passed in
ret = avcodec_encode_video2(output_stream->streams[0]->codec,
&encoder_pkt, picture, &got_packet);
// ret is 0 and got_packet is 1, but the image is all gray
}}}
--
Ticket URL: <https://trac.ffmpeg.org/ticket/3519>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list