picture: fix visible pitch/lines initialization
A video_format_t defines (in pixels):
- a picture size (
i_width,i_height); - a visible rectangle area (
i_visible_width,i_visible_height,i_x_offset,i_y_offset).
i_width
<---------------->
^ +----------------+ ^
| | | | i_y_offset
| | | v
| | ........... | ^
i_height | | : visible : | |
| | : area : | | i_visible_height
| | ........... | v
| | |
v +----------------+
<-><--------->
| i_visible_width
|
i_x_offset
A picture_t contains an array of plane_t, which defines:
- the physical storage size (
i_pitch,i_lines); - a content area (
i_visible_pitch,i_visible_lines).
A picture_t may be created and allocated from a video_format_t via
picture_NewFromFormat(). This function calls picture_InitPrivate(),
which itself calls picture_Setup(); here, the pitch and lines fields are
computed from aligned versions of the format i_width and i_height (to
at least a multiple of 64 or 32 respectively). Therefore, the resulting
picture storage may be larger than the size defined in the
video_format_t.
This is why a content area is necessary in plane_t to store the actual
content size, and this explains why an offset is not defined (an
alignment may only add margins to the right and to the bottom).
i_width
<---------------->
^ +----------------+*** ^ ^
| | |*** | |
| | |*** | i_visible_lines |
| | ........... |*** | |
i_height | | : visible : |*** | |
| | : area : |*** | | i_lines
| | ........... |*** | |
| | |*** | |
v +----------------+*** v |
********************* |
********************* v
<---------------->
i_visible_pitch *: margins for alignment
(in bytes)
The fields defining the content area in plane_t are misleadingly called
"visible", but they do not represent the "visible" area: they define the
actual format size (i_width and i_height) before alignment.
Concretely, for p a plane_t and fmt the video_format_t from which it is
created:
p->i_pitch = align(fmt->i_width) * pixel_sizep->i_lines = align(fmt->i_height)p->i_visible_pitch = fmt->i_width * pixel_sizep->i_visible_lines = fmt->i_height
Due to this confusion, p->i_visible_pitch and p->i_visible_lines were
mistakenly initialized from fmt->i_visible_width and
fmt->i_visible_height.
Fixes #27264 (closed)