AVFrame的线条大小为负



我正在使用libav(为MSVC构建的2.7)使用dshow:打开相机

input_format = av_find_input_format("dshow");
avformat_open_input(format_context, "video=Integrated Camera", input_format, 0);

当我打开视频流时;原始视频";(根据其long_name),格式为AV_PIX_FMT_BGR24。我需要在AV_PIX_FMT_RGB24中有帧,所以我制作了一个SwsContext,如下所示:

sws_context = sws_getContext(codec_context->width, codec_context->height, codec_context->pix_fmt, 
                             codec_context->width, codec_context->height, AV_PIX_FMT_RGB24,
                             SWS_BICUBIC, 0, 0, 0);
av_picture = new AVPicture();
avpicture_alloc(av_picture, AV_PIX_FMT_RGB24, codec_context->width, codec_context->height);

然后,我有一个循环计时器来读取帧并解码为AVFrame,然后将其传递给sws_scale。

while(av_read_frame(format_context, &packet) >= 0)
{
  if(packet.stream_index == stream_index)
  {
    av_frame = 0;
    av_frame = av_frame_alloc();
    avcodec_decode_video2(codec_context, av_frame, &frame_finished, &packet);
    if(frame_finished)
    {
      sws_scale(sws_context, (const uint8_t * const *)av_frame->data, av_frame->linesize,
                0, codec_context->height, av_picture->data, av_picture->linesize);
      av_free_packet(&packet);
      return;
    }
  }
  av_free_packet(&packet);
}

在此之后,我将在应用程序中使用av_picture,但是sws_scale挂起并崩溃。看看我进入sws_scale的所有数据,除了av_frame的行大小之外,没有什么奇怪的。CCD_ 8(linesize[1]linesize[2]如对BGR24所期望的那样为0)。由于我的画框宽度是640,我预计是1920,但负号似乎很奇怪。我试过翻转标志,但无济于事。我应该注意的是,它并不是每次都崩溃(有些运行会先通过几帧)。

为什么线条大小是负数?这是有什么意思,还是因为某种原因搞砸了?

Windows中位图和视频的标准RGB行排序是从下到上的(AFAIR是唯一相对新鲜的API,如WIC和Direct2D,其中行以自然方式重新排序)。线条从上到下的顺序由负高度表示,基本上是罕见的。这个行顺序并没有错,指向"第一个像素"的指针指向最后一行的最左边像素,然后您按负偏移量在行之间前进。libswscale可以处理此问题。

与负的biHeight(他们讨论过)相比,负的linesize不是对应负的biWidth(他们没有讨论过)吗?

不,惯例是这样的:如果biHeight是负的,那么它减去了行数,并且行的顺序颠倒了。biWidth总是正的(biWidth负责携带另一个扩展:如果有效载荷图像右侧有填充,它可能会被放大以指示非标准扩展步幅)。

相关内容

  • 没有找到相关文章

最新更新