[FFmpeg-trac] #2234(avcodec:new): FFMPEG crashes when trying to convert from PIX_FMT_YUV420P for specfic size of images
FFmpeg
trac at avcodec.org
Mon Feb 4 10:28:05 CET 2013
#2234: FFMPEG crashes when trying to convert from PIX_FMT_YUV420P for specfic size
of images
-------------------------------------+-------------------------------------
Reporter: | Type: defect
kirankumarcelestial | Priority: normal
Status: new | Version:
Component: avcodec | unspecified
Keywords: Crash, | Blocked By:
PIX_FMT_YUV420P | Reproduced by developer: 1
Blocking: |
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
Summary of the bug:
Hi I am trying to convert frames from PIX_FMT_YUYV422 to PIX_FMT_YUV420P,
for some resolution it crashes, but works for other resolutions of frame.
We have compiled Windows Version using instruction from
http://ffmpeg.zeranoe.com, and are using the latest build.
I managed to debug with windows using MinGW and used GDB, & below isthe
stack when it crashes.
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1792.0x14fc]
(gdb) bt
#0 0x6ab246f7 in extract_odd2avg_MMXEXT (count=-44, dst1=0x1c5c502c
<Address 0x1c5c502c out of bounds>, dst0=0x1c5af10c "",
src1=0x1db90761
"}"%"\200"\210"|c+c|"+ª{ª+"\200"+«~«ƒ¬x«,«{«,¬{¬+¬{¬,-\177¬ƒ-|-ƒ¬\177¬\200r
|rƒ-
xrƒ_{r,r|-,-|¬,-|¬,¬{r,_{-._vr._{_,_}°,_}rƒ±{_,_{r._|_\200_\177°ƒ_}±,r}_.r~r\201_|°ƒ_{_ƒ_{_._|°._~r.-
{r\201-|_\200_{r,-}_,r~-.rzrƒ-y-,-{-\201-}¬\200«{«,«z«.c{¬,¬"...,
src0=0x1db90411
"~".§~c,c}c+"xc,c}«+«\177«+c\177«+ª{-,-}-,¬|r+rx-ƒ-{r.-|_,r}-ƒ_|r.-{_,_|_.-zr.¬}«,-|¬,«|-\201_{_,_{_ƒ_|r,°\177°ƒ°{°.±{°._}°,_}°\200°z_,_{_,_|°ƒ_\200°,°~°ƒ°~°ƒr|_\201r|_,r\200r,r{r\
201r{r\200-zr,r\177_\200-~¬,-{_,r{-\201ry-ƒ-y«ƒ¬{¬,¬z¬+¬|¬+¬"...) at
libswscale/x86/rgb2rgb_template.c:2348
#1 yuyvtoyuv420_MMXEXT (ydst=<optimized out>,
udst=0x1c5af038
"|||z}|\177|~}x{}|{y{z||{{zy}{y{}{{}\177}~|{\177{z{~}{{zxzz|{yzzy{zy|zxzzyzzy~z||}zz{|}|xx{ywwxzzxxuyyzwxxxwxvyywzyyxwyzyxxzzzzy{y~wwzyx}yxyxzy}vxzwxyy{|wzyxy{{xy{yzz{}{|}xxyxwwy{"
,
vdst=0x1c5c4f58
".,+,+++,ƒ,ƒ+,,.,.,,ƒ\201\201,,ƒ,,\201\200,ƒ,ƒƒƒ,\201\201\201\201,,,\201,,ƒ,.,,.....,,+.,.,ƒ,ƒ,\201..++++\210<SSS\210++S<+SS<\210SO\215\210<\210<<<%<<\210%<\210\210\210+S%OS%%\210\
210%O%\210%SZS%SS%<%<<SSSO\215<O%SSSS%<OS\210S%O%S<S%+%%SS\210SOS%S"
<Address 0x1c5c5000 out of bounds>, src=<optimized out>, width=424,
height=240, lumStride=424, chromStride=212, srcStride=848)
at libswscale/x86/rgb2rgb_template.c:2363
#2 0x6ab1c25a in yuyvToYuv420Wrapper (c=0x9f3a470, src=0x1d99fb60,
srcStride=0x1d99fb80, srcSliceY=0, srcSliceH=240, dstParam=0x1d99fb70,
dstStride=0x1d99fb90)
at libswscale/swscale_unscaled.c:235
#3 0x6ab192f7 in sws_scale (c=0x9f3a470, srcSlice=0x1d99fbf4,
srcStride=0x1d99fbfc, srcSliceY=0, srcSliceH=240, dst=0x1d99fbe8,
dstStride=0x1d99fbdc)
at libswscale/swscale.c:928
How to reproduce:
{{{
Code to reproduce the issue is :
BOOL ConvertFromYUY2ToI420(BYTE* dataIn, DWORD inWidth, DWORD inHeight,
DWORD InLen)
{
struct SwsContext *img_convert_ctx = NULL;
uint8_t *downSample = new BYTE[InLen]; //new BYTE[InLen];
if (!downSample)
{
return FALSE;
}
memset(downSample, 0 , InLen);
int outstride[3];
int instride[2] ;
instride[0] = inWidth *2;
instride[1] = 0;
uint8_t *buf[2];
uint8_t *out[2];
out[0] = (uint8_t *) downSample;
out[1] = (uint8_t *) (downSample + (inWidth * inWidth)/2);
out[2] = (uint8_t *) (out[1] + ((inWidth * inWidth)/2));
//Strides
outstride[0] = inWidth;
outstride[1] = inWidth/2;
//outstride[2] = inWidth/4;
buf[0] = (uint8_t *) dataIn;
if(img_convert_ctx == NULL) {
img_convert_ctx = sws_getContext(inWidth, inHeight,
PIX_FMT_YUYV422,
inWidth,
inHeight,
PIX_FMT_YUV420P,
SWS_BICUBIC,
NULL,
NULL,
NULL);
}
if(img_convert_ctx == NULL) {
return FALSE;
}
sws_scale(img_convert_ctx,
buf,
instride,
0,
inHeight,
out,
outstride);
memset(dataIn, 0, InLen);
CopyMemory(dataIn, out[0], inWidth *inHeight);
CopyMemory((dataIn + (inWidth *inHeight)), out[1], (inWidth *inHeight/4));
CopyMemory( (dataIn + (inWidth *inHeight) + ((inWidth * inHeight)/4) ) ,
out[2], ((inWidth * inHeight)/4) );
sws_freeContext(img_convert_ctx);
img_convert_ctx = NULL;
if (downSample)
{
delete[] downSample;
downSample = NULL;
}
return TRUE;
}
The above code works for all Width X Height expect when the input
resoultion is the fallowing combinaton :
424 x 240
800 x 448
960 x 544
1280 x 720
ffmpeg version : 0.11.0
built on: Windows
}}}
Patches should be submitted to the ffmpeg-devel mailing list and not this
bug tracker.
--
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/2234>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list