[FFmpeg-trac] #576(swscale:new): sws_scale crash with PIX_FMT_YUVJ420P -> PIX_FMT_RGB24
FFmpeg
trac at avcodec.org
Thu Oct 27 09:07:20 CEST 2011
#576: sws_scale crash with PIX_FMT_YUVJ420P -> PIX_FMT_RGB24
------------------------------------+-----------------------------------
Reporter: rich99 | Owner: michael
Type: defect | Status: new
Priority: normal | Component: swscale
Version: git-master | Resolution:
Keywords: | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
------------------------------------+-----------------------------------
Description changed by cehoyos:
Old description:
> Last ffmpeg built from git, 10/20/2011 10:22:50AM.
>
> Win7 x64, VS2010, built using migGW and msys, gcc 4.5.2.
>
> Build options:
> ./configure --enable-shared --disable-static --enable-memalign-hack
> --target-os=mingw32 --arch=i686 --cpu=i686 --enable-avisynth --enable-
> zlib --enable-bzlib --enable-pthreads --enable-runtime-cpudetect
> --disable-encoders --enable-swscale --extra-cflags=-U__STRICT_ANSI__
>
> Everything works fine with playback except some crashes when using
> sws_scale and certain video files. Here is an example that always crashes
> with a sample code provided. I have stripped all checks to simplify the
> code to the maximum. The sample video is also attached. If I don't use
> sws_scale, everything works fine.
>
> main.cpp
> ---------------------------------
> #define __STDC_CONSTANT_MACROS
> #pragma warning(disable:4244)
>
> extern "C"
> {
> #include <stdint.h>
> #include <inttypes.h>
>
> #include "libavformat/avformat.h"
> #include "libswscale/swscale.h"
> #include "libavcodec/avcodec.h"
> #include <libavutil/opt.h>
> }
>
> int main()
> {
> av_register_all();
>
> AVFormatContext* pFormatCtx;
> av_open_input_file(&pFormatCtx, "ffdmjpeg.avi", NULL, 0, NULL);
> av_find_stream_info(pFormatCtx);
> dump_format(pFormatCtx, 0, "test", 0);
>
> AVCodecContext* pCodecCtx;
>
> // i know first stream is at index 0, simplified here
> unsigned int videoStream = 0;
> pCodecCtx = pFormatCtx->streams[videoStream]->codec;
>
> AVCodec* pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
> avcodec_open(pCodecCtx, pCodec);
>
> AVFrame* pFrame = avcodec_alloc_frame();
> AVFrame* pFrameRGB = avcodec_alloc_frame();
>
> PixelFormat destFormat = PIX_FMT_RGB24;
>
> // Determine required buffer size and allocate buffer
> int numBytes = avpicture_get_size(destFormat, pCodecCtx->width,
> pCodecCtx->height);
> uint8_t* buffer = (uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
> avpicture_fill((AVPicture *)pFrameRGB, buffer, destFormat,
> pCodecCtx->width, pCodecCtx->height);
>
> int frameFinished;
> AVPacket packet;
>
> SwsContext* swsContext = sws_alloc_context();
> //AVOption options;
> av_opt_set_defaults(swsContext);
> av_set_int(swsContext, "sws_flags", SWS_POINT);
> av_set_int(swsContext, "srcw", pCodecCtx->width);
> av_set_int(swsContext, "srch", pCodecCtx->height);
> av_set_int(swsContext, "dstw", pCodecCtx->width);
> av_set_int(swsContext, "dsth", pCodecCtx->height);
> av_set_int(swsContext, "src_format", pCodecCtx->pix_fmt);
> av_set_int(swsContext, "dst_format", destFormat);
> av_set_int(swsContext, "src_range", 1);
> av_set_int(swsContext, "dst_range", 1);
>
> sws_init_context(swsContext, NULL, NULL); //success
>
> while(av_read_frame(pFormatCtx, &packet) >= 0)
> {
> // Is this a packet from the video stream?
> if(packet.stream_index == videoStream)
> {
> // Decode video frame
> avcodec_decode_video2(pCodecCtx, pFrame,
> &frameFinished, &packet);
>
> // Did we get a video frame?
> if(frameFinished)
> {
> AVPicture &pic =
> *(AVPicture*)pFrame;
> AVPicture &picDst =
> *(AVPicture*)pFrameRGB;
> // [CRASH HERE]
> sws_scale(swsContext,
> &pic.data[0], &pic.linesize[0], 0, pCodecCtx->height, &picDst.data[0],
> &picDst.linesize[0]);
> //
> printf(".");
> }
> }
>
> // Free the packet that was allocated by av_read_frame
> av_free_packet(&packet);
> }
>
> av_free(buffer);
> av_free(pFrameRGB);
> av_free(pFrame);
> sws_freeContext(swsContext);
> avcodec_close(pCodecCtx);
> av_close_input_file(pFormatCtx);
>
> return 0;
> }
New description:
Last ffmpeg built from git, 10/20/2011 10:22:50AM.
Win7 x64, VS2010, built using migGW and msys, gcc 4.5.2.
Build options:
./configure --enable-shared --disable-static --enable-memalign-hack
--target-os=mingw32 --arch=i686 --cpu=i686 --enable-avisynth --enable-zlib
--enable-bzlib --enable-pthreads --enable-runtime-cpudetect --disable-
encoders --enable-swscale --extra-cflags=-U__STRICT_ANSI__
Everything works fine with playback except some crashes when using
sws_scale and certain video files. Here is an example that always crashes
with a sample code provided. I have stripped all checks to simplify the
code to the maximum. The sample video is also attached. If I don't use
sws_scale, everything works fine.
main.cpp
{{{
#define __STDC_CONSTANT_MACROS
#pragma warning(disable:4244)
extern "C"
{
#include <stdint.h>
#include <inttypes.h>
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavcodec/avcodec.h"
#include <libavutil/opt.h>
}
int main()
{
av_register_all();
AVFormatContext* pFormatCtx;
av_open_input_file(&pFormatCtx, "ffdmjpeg.avi", NULL, 0, NULL);
av_find_stream_info(pFormatCtx);
dump_format(pFormatCtx, 0, "test", 0);
AVCodecContext* pCodecCtx;
// i know first stream is at index 0, simplified here
unsigned int videoStream = 0;
pCodecCtx = pFormatCtx->streams[videoStream]->codec;
AVCodec* pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
avcodec_open(pCodecCtx, pCodec);
AVFrame* pFrame = avcodec_alloc_frame();
AVFrame* pFrameRGB = avcodec_alloc_frame();
PixelFormat destFormat = PIX_FMT_RGB24;
// Determine required buffer size and allocate buffer
int numBytes = avpicture_get_size(destFormat, pCodecCtx->width,
pCodecCtx->height);
uint8_t* buffer = (uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
avpicture_fill((AVPicture *)pFrameRGB, buffer, destFormat,
pCodecCtx->width, pCodecCtx->height);
int frameFinished;
AVPacket packet;
SwsContext* swsContext = sws_alloc_context();
//AVOption options;
av_opt_set_defaults(swsContext);
av_set_int(swsContext, "sws_flags", SWS_POINT);
av_set_int(swsContext, "srcw", pCodecCtx->width);
av_set_int(swsContext, "srch", pCodecCtx->height);
av_set_int(swsContext, "dstw", pCodecCtx->width);
av_set_int(swsContext, "dsth", pCodecCtx->height);
av_set_int(swsContext, "src_format", pCodecCtx->pix_fmt);
av_set_int(swsContext, "dst_format", destFormat);
av_set_int(swsContext, "src_range", 1);
av_set_int(swsContext, "dst_range", 1);
sws_init_context(swsContext, NULL, NULL); //success
while(av_read_frame(pFormatCtx, &packet) >= 0)
{
// Is this a packet from the video stream?
if(packet.stream_index == videoStream)
{
// Decode video frame
avcodec_decode_video2(pCodecCtx, pFrame,
&frameFinished, &packet);
// Did we get a video frame?
if(frameFinished)
{
AVPicture &pic =
*(AVPicture*)pFrame;
AVPicture &picDst =
*(AVPicture*)pFrameRGB;
// [CRASH HERE]
sws_scale(swsContext,
&pic.data[0], &pic.linesize[0], 0, pCodecCtx->height, &picDst.data[0],
&picDst.linesize[0]);
//
printf(".");
}
}
// Free the packet that was allocated by av_read_frame
av_free_packet(&packet);
}
av_free(buffer);
av_free(pFrameRGB);
av_free(pFrame);
sws_freeContext(swsContext);
avcodec_close(pCodecCtx);
av_close_input_file(pFormatCtx);
return 0;
}
}}}
--
--
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/576#comment:5>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list