9

YUV420Pを使用して、画像(H.264ストリームから受け取った)をに変換しRGB、サイズを変更したいsws_scale
元画像のサイズは です480 × 800。同じ次元で変換するだけでうまくいきます。
しかし、寸法を変更しようとすると、次のパターンで歪んだ画像が表示されます。

  • に変更する481 × 800と、途中でカットされたように見える歪んだ白黒画像が生成されます
  • 482 × 800さらに歪む
  • 483 × 800歪んでいるが色がついている
  • 484 × 800大丈夫です(正しくスケーリングされています)。

このパターンは次のとおりです。スケーリングは、差が 4 で除算される場合にのみ正常に機能します。

これは、画像をデコードして変換する方法のサンプル コードです。すべてのメソッドは「成功」を示しています。

int srcX = 480;
int srcY = 800;
int dstX = 481; // or 482, 483 etc
int dstY = 800;

AVFrame* avFrameYUV = avcodec_alloc_frame();
avpicture_fill((AVPicture *)avFrameYUV, decoded_yuv_frame, PIX_FMT_YUV420P, srcX , srcY);

AVFrame *avFrameRGB = avcodec_alloc_frame();

AVPacket avPacket;
av_init_packet(&avPacket);
avPacket.size = read; // size of raw data
avPacket.data = raw_data; // raw data before decoding to YUV

int frame_decoded = 0;
int decoded_length = avcodec_decode_video2(g_avCodecContext, avFrameYUV, &frame_decoded, &avPacket);
int size = dstX * dstY * 3;

struct SwsContext *img_convert_ctx = sws_getContext(srcX, srcY, SOURCE_FORMAT, dstX, dstY, PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);

avpicture_fill((AVPicture *)avFrameRGB, rgb_frame, PIX_FMT_RGB24, dstX, dstY);
sws_scale(img_convert_ctx, avFrameYUV->data, avFrameYUV->linesize, 0, srcY, avFrameRGB->data, avFrameRGB->linesize);

// draws the resulting frame with windows BitBlt
DrawBitmap(hdc, dstX, dstY, rgb_frame, size);

sws_freeContext(img_convert_ctx); 
4

1 に答える 1