c++ - texto - ¿Qué significa ''alineación de líneas''?
tipos de alineacion en power point (3)
Mi práctica:
1 . Un problema desaprovechado de la imagen , reemplazo las funciones de imagen de AV con funciones AVFrame e imgutils . muestra de código:
//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);
...
if (_pictureFrame) {
av_free(_pictureFrame);
if (_pictureFrameData) {
free(_pictureFrameData);
}
}
Parámetro 2.align
Primero ajusto el alineamiento a 32 , pero para algunas transmisiones de video no funcionó, causó imágenes distorsionadas. Luego lo configuré en 16 ( mi entorno: mac, Xcode, iPhone6 ), algunas transmisiones funcionan bien. Pero al final fijé el alineamiento en 1 , porque encontré esto
Fill in the AVPicture fields, always assume a linesize alignment of 1.
Estoy siguiendo el tutorial de ffmpeg en http://dranger.com/ffmpeg/tutorial01.html .
Acabo de encontrar que la función avpicture_get_size
está en desuso.
Así que he comprobado el documento de ffmpeg ( https://www.ffmpeg.org/doxygen/3.0/group__lavu__picture.html#ga24a67963c3ae0054a2a4bab35930e694 ) y av_image_get_buffer_size
encontrado el sustituto av_image_get_buffer_size
.
Pero no puedo entender align
parámetro que significa ''alineación de líneas'' ......
¿Qué significa?
Algunas partes de FFmpeg, especialmente libavcodec, requieren líneas alineadas [], lo que significa que requiere:
assert(linesize[0] % 32 == 0);
assert(linesize[1] % 32 == 0);
assert(linesize[2] % 32 == 0);
Esto le permite utilizar rutinas SIMD rápidas / alineadas (por ejemplo, instrucciones movdqa
o vmovdqa
SSE2 / AVX2) para el acceso a datos en lugar de sus contrapartes desalineadas más lentas.
El parámetro de align
a esta función av_image_get_buffer_size
es esta alineación de línea, y la necesita porque el tamaño del búfer se ve afectado por ella. Por ejemplo, el tamaño de un plano Y en un búfer YUV no es en realidad ancho * alto, es tamaño lineal [0] * alto. Verá que (especialmente para tamaños de imagen que no son múltiplos de 16 o 32), a medida que aumenta la align
a mayores potencias de 2, el valor de retorno aumenta lentamente.
En términos prácticos, si va a utilizar esta imagen como buffer de salida para llamadas a, por ejemplo, avcodec_decode_video2
, esto debería ser 32. Para swscale / avfilter, creo que no hay un requisito absoluto, pero se recomienda que siga siendo 32.
Si observa la definición de avpicture_get_size en la versión 3.2, verá el siguiente código:
int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height)
{
return av_image_get_buffer_size(pix_fmt, width, height, 1);
}
Simplemente llama a la función sugerida: av_image_get_buffer_size
con el parámetro align
establecido en 1
. No fui más allá para descubrir el significado completo de por qué 1
se usa para la función depreciada. Como de costumbre con ffmpeg, uno probablemente puede resolverlo leyendo el código correcto y suficiente código (con algunos experimentos de código).