Opened 11 years ago
Closed 11 years ago
#3519 closed defect (invalid)
Decoding mpegts h264 i-frame into jpeg occasionally gives gray or green images
Reported by: | werner | Owned by: | |
---|---|---|---|
Priority: | normal | Component: | undetermined |
Version: | 2.2 | Keywords: | |
Cc: | Blocked By: | ||
Blocking: | Reproduced by developer: | no | |
Analyzed by developer: | no |
Description
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
Change History (3)
comment:1 by , 11 years ago
follow-up: 3 comment:2 by , 11 years ago
- No, the problem is not reproducible with ffmpeg itself (
ffmpeg -skip_frame nokey -i udp://<ip:port> -f image2 -vf "select='eq(pict_type,PICT_TYPE_I)',fps=fps=1/3" -vsync vfr ~/images/thumb%04d.jpg
), but I need to be able to support different output than the filesystem (storing in a memory cache with metadata) and processing via ffmpeg takes up more memory and cpu (again, I believe it's because it parses all the frames as opposed to just specific iframes). - I thought I should upload the file here as an attachment (which the limit is marked as 2.5MB); I didn't realize there was an ftp server (which suggests a 10MB limit, which I can try to stay under). I haven't pinpointed a small chunk of the video yet that will reproduce the problem as it is streamed on a loop in our lab. I will parse the video and upload as small of a chunk as possible.
I did manage to fix my problem by saving old successful iframes and passing them along to the next iframe decode. Takes a bit more processing power, which I assume essentially emulates what ffmpeg does behind the scenes.
I still think ffmpeg should report back to the user in some manner if it can't process a frame and instead produces a gray image.
comment:3 by , 11 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
Replying to werner:
I still think ffmpeg should report back to the user in some manner if it can't process a frame and instead produces a gray image.
I still wonder how FFmpeg can produce a gray frame (it rarely does here / it is a bug that we would like to fix if it does).
Note that valid H.264 streams do not necessarily contain I-frames.
Is the problem reproducible with
ffmpeg
(the application)? Please test current git head before reporting problems on this bug tracker and please tell us if you feel this isn't explained on https://ffmpeg.org/bugreports.htmlPlease upload the sample, there is no filesize limit (but it may make sense if you cut the sample as long as your problem is reproducible).