什么是' lineize alignment'含义?

时间:2016-02-28 02:34:19

标签: c++ ffmpeg

我正在http://dranger.com/ffmpeg/tutorial01.html中关注ffmpeg教程。

我刚刚发现avpicture_get_size函数已被弃用。

所以我查看了ffmpeg的文档(https://www.ffmpeg.org/doxygen/3.0/group__lavu__picture.html#ga24a67963c3ae0054a2a4bab35930e694)并找到了替换av_image_get_buffer_size

但我无法理解align参数含义' lineize alignment' ......

这是什么意思?

3 个答案:

答案 0 :(得分:15)

FFmpeg的某些部分,特别是libavcodec,需要对齐的linesizes [],这意味着它需要:

assert(linesize[0] % 32 == 0);
assert(linesize[1] % 32 == 0);
assert(linesize[2] % 32 == 0);

这允许它使用快速/对齐的SIMD例程(例如SSE2 / AVX2 movdqavmovdqa指令)来进行数据访问,而不是使用较慢的未对齐的对应程序。

align函数的av_image_get_buffer_size参数是此行对齐,您需要它,因为缓冲区的大小受其影响。例如,YUV缓冲区中Y平面的大小实际上不是宽度*高度,它的线条大小为[0] *高度。您会看到(特别是对于不是16或32的倍数的图像大小),当您将align增加到2的更高幂时,返回值会慢慢增加。

实际上,如果你打算使用这张图片作为输出缓冲区来调用例如avcodec_decode_video2,这应该是32.对于swscale / avfilter,我认为没有绝对的要求,但你建议你仍然要做到32。

答案 1 :(得分:7)

我的做法:

1 avpicture 弃用问题,我用 AVFrame &替换了avpicture功能 imgutils 功能。代码示例:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.15.0/jquery.validate.min.js"></script>

<form action="index.php" name="formInput" method="POST" autocomplete="off">
  <label class="input"><span class="fontBold fontItalic">Email address</span>
    <br>
    <input type="email" name="pgEmail" id="txtNewEmail" oninput="verifyPEmail();" value="">
  </label>
  <div class="registrationFormAlert" id="divCheckValidEmail"></div>

  <label class="input"><span class="fontBold fontItalic">Password</span>
    <br>
    <input type="password" name="pass1" id="pass1" oninput="verifyPass1();" value="">
  </label>
  <div class="registrationFormAlert" id="divCheckPass1"></div>

  <label class="input"><span class="fontBold fontItalic">Verify Password</span>
    <br>
    <input type="password" name="pass2" id="pass2" oninput="verifyPass2();" value="">
  </label>
  <div class="registrationFormAlert" id="divCheckPass2"></div>
</form>

...

   //AVPicture           _picture;
   AVFrame             *_pictureFrame;
   uint8_t             *_pictureFrameData;

...

//_pictureValid = avpicture_alloc(&_picture,
//                                AV_PIX_FMT_RGB24,
//                               _videoCodecCtx->width,
//                               _videoCodecCtx->height) == 0;

_pictureFrame = av_frame_alloc();
_pictureFrame->width = _videoCodecCtx->width;
_pictureFrame->height = _videoCodecCtx->height;
_pictureFrame->format = AV_PIX_FMT_RGB24;

int size = av_image_get_buffer_size(_pictureFrame->format,
                                    _pictureFrame->width,
                                    _pictureFrame->height,
                                    1);

//dont forget to free _pictureFrameData at last                                    
_pictureFrameData = (uint8_t*)av_malloc(size);

 av_image_fill_arrays(_pictureFrame->data,
                      _pictureFrame->linesize,
                      _pictureFrameData,
                      _pictureFrame->format,
                      _pictureFrame->width,
                      _pictureFrame->height,
                      1);

2.align parameter

首先我将对齐设置为 32 ,但对于某些视频流,它不起作用,导致图像失真。然后我将其设置为 16 我的环境:mac,Xcode,iPhone6 ),一些流运行良好。但最后我将对齐设置为 1 ,因为我找到了this

if (_pictureFrame) {
    av_free(_pictureFrame);
    if (_pictureFrameData) {
        free(_pictureFrameData);
    }
}

答案 2 :(得分:2)

如果您在3.2版中查看avpicture_get_size的定义,请看以下代码:

<div class="row">
    <div class="col-sm-12">
        <div id="table_filter" class="dataTables_filter pull-left">
            <label>
                <input type="search" class="form-control input-sm" placeholder="Search" aria-controls="table">
            </label>
        </div>
    </div>
</div>

它只是调用建议的函数:int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height) { return av_image_get_buffer_size(pix_fmt, width, height, 1); } av_image_get_buffer_size参数设置为align。我没有进一步了解为什么1用于折旧函数的全部意义。像ffmpeg一样,人们可以通过阅读正确的代码和足够的代码(通过一些代码实验)来解决这个问题。