2014-07-26 5 views
4

libswscale을 사용하여 YUV 프레임을 RGB로 변환하려고합니다.avcodec YUV to RGB

AVFrame *RGBFrame; 
SwsContext *ConversionContext; 

ConversionContext = sws_getCachedContext(NULL, FrameWidth, FrameHeight, AV_PIX_FMT_YUV420P, FrameWidth, FrameHeight, AV_PIX_FMT_RGB24, SWS_BILINEAR, 0, 0, 0); 
RGBFrame = av_frame_alloc(); 

avpicture_fill((AVPicture *)RGBFrame, &FillVect[0], AV_PIX_FMT_RGB24, FrameWidth, FrameHeight); 

sws_scale(ConversionContext, VideoFrame->data, VideoFrame->linesize, 0, VideoFrame->height, RGBFrame->data, RGBFrame->linesize); 

내 프로그램이 sws_scale 기능에 세그먼트 폴트를 수행

여기 내 코드입니다.

VideoFrame은 내 디코딩 된 프레임을 보유하고있는 AVFrame 구조체입니다. YUV420P 이론적 하나의 평면을 가지고 있지만

VideoFrame->data[0] // Y array, linesize = frame width 
VideoFrame->data[1] // U array, linesize = frame width/2 
VideoFrame->data[2] // V array, linesize = frame width/2 

(위키에 따른 YUV420P 후, Y 평면 형식 :

은이 같은 배열을 반환 avcodec_decode_video2에서 온 YUV 프레임 때문이라고 생각 , U, V 데이터는 함께 그룹화됩니다). 그래서 swscale을 사용하여 Y, U, V 데이터가 RGB24로 분리되는 배열로 변환하는 방법을 알지 못합니다.

제발 도와주세요, 감사합니다 :)

답변

1

av_frame_alloc은 프레임 객체 자체에 대한 메모리를 할당, 이미지 데이터를 저장하는 메모리를 할당하지 않습니다. 작업이 완료 적이 :

FillVect.resize(avpicture_get_size(PIX_FMT_RGB24, FrameWidth, FrameHeight));

곳을 코드에서 avpicture_fill를 호출하기 전에? 또는 FillVect가 전체 디코딩 된 그림을 유지할만큼 충분한 메모리를 할당하는지 확인하는 다른 방법은 있습니까?

valgrind에서 실행하여 SEGFAULT가 정확히 무엇인지 확인하려고 했습니까?