Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
165ae570 by Steve Lhomme at 2024-03-12T07:29:36+00:00
direct3d11: fix logging with picture dimensions

- - - - -
44f37018 by Steve Lhomme at 2024-03-12T07:29:36+00:00
direct3d11: ignore the crop information of incoming regions

We always copy the whole region in a texture/quad.

- - - - -
1872f641 by Steve Lhomme at 2024-03-12T07:29:36+00:00
opengl: use the actual region picture dimensions

Rather than the region formatting (ie. placement) of the picture.

- - - - -
fca2debb by Steve Lhomme at 2024-03-12T07:29:36+00:00
vlc_subpictures: add a structure to hold rendered regions

So we don't have to deal with all the fields of a regular region. The zoom 
should only
be in the rendered region too.

- - - - -
83181fa9 by Steve Lhomme at 2024-03-12T07:29:36+00:00
vlc_subpicture: replace the rendered regions by a vector of 
subpicture_region_rendered

- - - - -
1b21e94f by Steve Lhomme at 2024-03-12T07:29:36+00:00
vlc_subpicture: remove the rendering zoom from subpicture_region_t

It's only useful when rendering, not in the source subregions.

- - - - -
d65ee1fc by Steve Lhomme at 2024-03-12T07:29:36+00:00
vlc_subpictures: replace rendered position with a display placement

For now only the x/y part of the placement structure are used.

- - - - -
f4247dce by Steve Lhomme at 2024-03-12T07:29:36+00:00
vout_subpictures: set the rendered region placement dimensions using the region 
format

So we have all placement fields set for the display modules.

- - - - -
41525773 by Steve Lhomme at 2024-03-12T07:29:36+00:00
vlc_subpictures: set the source offset in a separate fields

So we can get rid of the whole video_format_t.

- - - - -
6248cdcc by Steve Lhomme at 2024-03-12T07:29:36+00:00
subpicture: don't apply extra SAR when blending

The SAR has already been applied when resizing the region picture to the 
destination size. It's not used by any other renderer.

This patch works fine with DVD sources that do have a SAR  on their region.

- - - - -
3dc2d018 by Steve Lhomme at 2024-03-12T07:29:36+00:00
vlc_subpictures: remove unused rendered region format

We have either cropping in the source picture or placement in the display 
coordinates.
The picture format also has all the colorimetry we need.

- - - - -


13 changed files:

- include/vlc_subpicture.h
- modules/access/bluray.c
- modules/hw/mmal/vout.c
- modules/video_output/android/display.c
- modules/video_output/apple/VLCSampleBufferDisplay.m
- modules/video_output/libplacebo/display.c
- modules/video_output/opengl/sub_renderer.c
- modules/video_output/win32/direct3d11.cpp
- modules/video_output/win32/direct3d9.c
- modules/video_output/xcb/render.c
- src/misc/subpicture.c
- src/video_output/vout_subpictures.c
- test/modules/video_output/opengl/sub_renderer.c


Changes:

=====================================
include/vlc_subpicture.h
=====================================
@@ -31,6 +31,8 @@
 #include <vlc_picture.h>
 #include <vlc_text_style.h>
 #include <vlc_list.h>
+#include <vlc_vector.h>
+#include <vlc_vout_display.h>
 
 /**
  * \defgroup subpicture Video sub-pictures
@@ -81,9 +83,6 @@ struct subpicture_region_t
     int             i_max_width;     /** horizontal rendering/cropping 
target/limit */
     int             i_max_height;    /** vertical rendering/cropping 
target/limit */
 
-    vlc_rational_t  zoom_h;
-    vlc_rational_t  zoom_v;
-
     struct vlc_list node;             /**< for inclusion in a vlc_spu_regions 
*/
     subpicture_region_private_t *p_private;  /**< Private data for spu_t 
*only* */
 };
@@ -206,9 +205,21 @@ typedef struct
 
 typedef struct subpicture_private_t subpicture_private_t;
 
+struct subpicture_region_rendered
+{
+    picture_t       *p_picture;          /**< picture comprising this region */
+
+    unsigned             source_offset_x;
+    unsigned             source_offset_y;
+    vout_display_place_t place;    // position of region, relative to alignment
+    int             i_alpha;                               /**< transparency */
+    vlc_rational_t  zoom_h;
+    vlc_rational_t  zoom_v;
+};
+
 struct vlc_render_subpicture
 {
-    vlc_spu_regions regions;                  /**< list of regions to render */
+    struct VLC_VECTOR(struct subpicture_region_rendered *) regions; /**< list 
of regions to render */
     int64_t      i_order;                    /** an increasing unique number */
     unsigned     i_original_picture_width;  /**< original width of the movie */
     unsigned     i_original_picture_height;/**< original height of the movie */


=====================================
modules/access/bluray.c
=====================================
@@ -1670,8 +1670,6 @@ static void subpictureUpdaterUpdate(subpicture_t 
*p_subpic,
         // fields not modified on the source
         p_dst->i_align  = p_src->i_align;
         p_dst->i_alpha  = p_src->i_alpha;
-        p_dst->zoom_h   = p_src->zoom_h;
-        p_dst->zoom_v   = p_src->zoom_v;
 
         vlc_spu_regions_push(&p_subpic->regions, p_dst);
     }


=====================================
modules/hw/mmal/vout.c
=====================================
@@ -744,17 +744,17 @@ static int attach_subpics(vout_display_t * const vd, 
vout_display_sys_t * const
     }
 
     // Attempt to import the subpics
-    const subpicture_region_t *sreg;
-    vlc_spu_regions_foreach_const(sreg, &spic->regions) {
-        picture_t *const src = sreg->p_picture;
+    const struct subpicture_region_rendered *r;
+    vlc_vector_foreach(r, &spic->regions) {
+        picture_t *const src = r->p_picture;
 
         // At this point I think the subtitles are being placed in the
         // coord space of the cfg rectangle
         if ((sys->subpic_bufs[n] = hw_mmal_vzc_buf_from_pic(sys->vzc,
             src,
             (MMAL_RECT_T){.width = vd->cfg->display.width, 
.height=vd->cfg->display.height},
-            sreg->i_x, sreg->i_y,
-            sreg->i_alpha,
+            r->place.x, r->place.y,
+            r->i_alpha,
             n == 0)) == NULL)
         {
             msg_Err(vd, "Failed to allocate vzc buffer for subpic");


=====================================
modules/video_output/android/display.c
=====================================
@@ -132,10 +132,8 @@ static bool subpicture_NeedDraw(vout_display_t *vd,
 
     sub->clear = true;
 
-    const subpicture_region_t *r;
-    size_t count = 0;
-    vlc_spu_regions_foreach_const(r, &subpicture->regions)
-        count++;
+    size_t count = subpicture->regions.size;
+    const struct subpicture_region_rendered *r;
 
     if (subpicture->i_order != sub->last_order)
     {
@@ -149,12 +147,12 @@ static bool subpicture_NeedDraw(vout_display_t *vd,
     if (count == sub->regions.size)
     {
         size_t i = 0;
-        vlc_spu_regions_foreach_const(r, &subpicture->regions)
+        vlc_vector_foreach(r, &subpicture->regions)
         {
             struct sub_region *cmp = &sub->regions.data[i++];
-            if (cmp->x != r->i_x || cmp->y != r->i_y
-             || cmp->width != r->fmt.i_visible_width
-             || cmp->height != r->fmt.i_visible_height)
+            if (cmp->x != r->place.x || cmp->y != r->place.y
+             || cmp->width != r->place.width
+             || cmp->height != r->place.height)
             {
                 /* Subpicture regions are different */
                 draw = true;
@@ -179,13 +177,13 @@ end:
 
     sub->regions.size = 0;
 
-    vlc_spu_regions_foreach_const(r, &subpicture->regions)
+    vlc_vector_foreach(r, &subpicture->regions)
     {
         struct sub_region reg = {
-            .x = r->i_x,
-            .y = r->i_y,
-            .width = r->fmt.i_visible_width,
-            .height = r->fmt.i_visible_height,
+            .x = r->place.x,
+            .y = r->place.y,
+            .width = r->place.width,
+            .height = r->place.height,
         };
         bool res = vlc_vector_push(&sub->regions, reg);
         /* Already checked with vlc_vector_reserve */


=====================================
modules/video_output/apple/VLCSampleBufferDisplay.m
=====================================
@@ -405,19 +405,19 @@ static void RenderPicture(vout_display_t *vd, picture_t 
*pic, vlc_tick_t date) {
 
 static CGRect RegionBackingFrame(VLCSampleBufferDisplay* sys,
                                  const vlc_render_subpicture *subpicture,
-                                 const subpicture_region_t *r)
+                                 const struct subpicture_region_rendered *r)
 {
     const float scale_w = (float)(sys->place.width)  / 
subpicture->i_original_picture_width;
     const float scale_h = (float)(sys->place.height) / 
subpicture->i_original_picture_height;
 
     // Invert y coords for CoreGraphics
-    const float y = subpicture->i_original_picture_height - 
r->fmt.i_visible_height - r->i_y;
+    const float y = subpicture->i_original_picture_height - r->place.height - 
r->place.y;
 
     return CGRectMake(
-        scale_w * r->i_x + sys->place.x,
+        scale_w * r->place.x + sys->place.x,
         scale_h * y + sys->place.y,
-        scale_w * r->fmt.i_visible_width,
-        scale_h * r->fmt.i_visible_height
+        scale_w * r->place.width,
+        scale_h * r->place.height
     );
 }
 
@@ -432,12 +432,12 @@ static void UpdateSubpictureRegions(vout_display_t *vd,
 
     NSMutableArray *regions = [NSMutableArray new];
     CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
-    const subpicture_region_t *r;
-    vlc_spu_regions_foreach_const(r, &subpicture->regions) {
+    const struct subpicture_region_rendered *r;
+    vlc_vector_foreach(r, &subpicture->regions) {
         CFIndex length = r->p_picture->format.i_height * 
r->p_picture->p->i_pitch;
         const size_t pixels_offset =
-                r->fmt.i_y_offset * r->p_picture->p->i_pitch +
-                r->fmt.i_x_offset * r->p_picture->p->i_pixel_pitch;
+                r->source_offset_y * r->p_picture->p->i_pitch +
+                r->source_offset_x * r->p_picture->p->i_pixel_pitch;
 
         CFDataRef data = CFDataCreate(
             NULL,
@@ -445,7 +445,7 @@ static void UpdateSubpictureRegions(vout_display_t *vd,
             length - pixels_offset);
         CGDataProviderRef provider = CGDataProviderCreateWithCFData(data);
         CGImageRef image = CGImageCreate(
-            r->fmt.i_visible_width, r->fmt.i_visible_height,
+            r->place.width, r->place.height,
             8, 32, r->p_picture->p->i_pitch,
             space, kCGImageAlphaFirst,
             provider, NULL, true, kCGRenderingIntentDefault
@@ -479,10 +479,8 @@ static bool IsSubpictureDrawNeeded(vout_display_t *vd, 
const vlc_render_subpictu
         return true;
     }
 
-    size_t count = 0;
-    const subpicture_region_t *r;
-    vlc_spu_regions_foreach_const(r, &subpicture->regions)
-        count++;
+    size_t count = subpicture->regions.size;
+    const struct subpicture_region_rendered *r;
 
     if (!sys.subpicture || subpicture->i_order != sys.subpicture.order)
     {
@@ -499,7 +497,7 @@ static bool IsSubpictureDrawNeeded(vout_display_t *vd, 
const vlc_render_subpictu
     if (count == sys.subpicture.regions.count)
     {
         size_t i = 0;
-        vlc_spu_regions_foreach_const(r, &subpicture->regions)
+        vlc_vector_foreach(r, &subpicture->regions)
         {
             VLCSampleBufferSubpictureRegion *region =
                 sys.subpicture.regions[i++];


=====================================
modules/video_output/libplacebo/display.c
=====================================
@@ -365,10 +365,8 @@ static void PictureRender(vout_display_t *vd, picture_t 
*pic,
     }
 
     if (subpicture) {
-        int num_regions = 0;
-        const subpicture_region_t *r;
-        vlc_spu_regions_foreach_const(r, &subpicture->regions)
-            num_regions++;
+        int num_regions = subpicture->regions.size;
+        const struct subpicture_region_rendered *r;
 
         // Grow the overlays array if needed
         if (num_regions > sys->num_overlays) {
@@ -389,7 +387,7 @@ static void PictureRender(vout_display_t *vd, picture_t 
*pic,
 
         // Upload all of the regions
         int i = 0;
-        vlc_spu_regions_foreach_const(r, &subpicture->regions) {
+        vlc_vector_foreach(r, &subpicture->regions) {
             assert(r->p_picture->i_planes == 1);
             struct pl_plane_data subdata[4];
             if (!vlc_placebo_PlaneData(r->p_picture, subdata, NULL))
@@ -413,14 +411,14 @@ static void PictureRender(vout_display_t *vd, picture_t 
*pic,
 
             sys->overlay_parts[i] = (struct pl_overlay_part) {
                 .src = {
-                    .x1 = r->fmt.i_visible_width,
-                    .y1 = r->fmt.i_visible_height,
+                    .x1 = r->place.width,
+                    .y1 = r->place.height,
                 },
                 .dst = {
-                    .x0 = place.x + r->i_x,
-                    .y0 = place.y + r->i_y * ysign,
-                    .x1 = place.x + r->i_x + r->fmt.i_visible_width,
-                    .y1 = place.y + (r->i_y + r->fmt.i_visible_height) * ysign,
+                    .x0 = place.x + r->place.x,
+                    .y0 = place.y + r->place.y * ysign,
+                    .x1 = place.x + r->place.x + r->place.width,
+                    .y1 = place.y + (r->place.y + r->place.height) * ysign,
                 },
             };
             i++;


=====================================
modules/video_output/opengl/sub_renderer.c
=====================================
@@ -235,10 +235,8 @@ vlc_gl_sub_renderer_Prepare(struct vlc_gl_sub_renderer *sr,
     gl_region_t *last = sr->regions;
 
     if (subpicture) {
-        int count = 0;
-        const subpicture_region_t *r;
-        vlc_spu_regions_foreach_const(r, &subpicture->regions)
-            count++;
+        int count = subpicture->regions.size;
+        const struct subpicture_region_rendered *r;
 
         gl_region_t *regions = calloc(count, sizeof(*regions));
         if (!regions)
@@ -248,25 +246,25 @@ vlc_gl_sub_renderer_Prepare(struct vlc_gl_sub_renderer 
*sr,
         sr->regions = regions;
 
         int i = 0;
-        vlc_spu_regions_foreach_const(r, &subpicture->regions) {
+        vlc_vector_foreach(r, &subpicture->regions) {
             gl_region_t *glr = &sr->regions[i];
 
-            glr->width  = r->fmt.i_visible_width;
-            glr->height = r->fmt.i_visible_height;
+            glr->width  = r->p_picture->format.i_visible_width;
+            glr->height = r->p_picture->format.i_visible_height;
             if (!sr->api->supports_npot) {
-                glr->width  = stdc_bit_ceil((unsigned)glr->width);
-                glr->height = stdc_bit_ceil((unsigned)glr->height);
-                glr->tex_width  = (float) r->fmt.i_visible_width  / glr->width;
-                glr->tex_height = (float) r->fmt.i_visible_height / 
glr->height;
+                glr->width  = 
stdc_bit_ceil(r->p_picture->format.i_visible_width);
+                glr->height = 
stdc_bit_ceil(r->p_picture->format.i_visible_height);
+                glr->tex_width  = (float) r->p_picture->format.i_visible_width 
 / glr->width;
+                glr->tex_height = (float) 
r->p_picture->format.i_visible_height / glr->height;
             } else {
                 glr->tex_width  = 1.0;
                 glr->tex_height = 1.0;
             }
             glr->alpha  = (float)r->i_alpha / 255;
-            glr->left   =  2.0 * (r->i_x                          ) / 
subpicture->i_original_picture_width  - 1.0;
-            glr->top    = -2.0 * (r->i_y                          ) / 
subpicture->i_original_picture_height + 1.0;
-            glr->right  =  2.0 * (r->i_x + r->fmt.i_visible_width ) / 
subpicture->i_original_picture_width  - 1.0;
-            glr->bottom = -2.0 * (r->i_y + r->fmt.i_visible_height) / 
subpicture->i_original_picture_height + 1.0;
+            glr->left   =  2.0 * (r->place.x                  ) / 
subpicture->i_original_picture_width  - 1.0;
+            glr->top    = -2.0 * (r->place.y                  ) / 
subpicture->i_original_picture_height + 1.0;
+            glr->right  =  2.0 * (r->place.x + r->place.width ) / 
subpicture->i_original_picture_width  - 1.0;
+            glr->bottom = -2.0 * (r->place.y + r->place.height) / 
subpicture->i_original_picture_height + 1.0;
 
             glr->texture = 0;
             /* Try to recycle the textures allocated by the previous
@@ -282,8 +280,8 @@ vlc_gl_sub_renderer_Prepare(struct vlc_gl_sub_renderer *sr,
             }
 
             const size_t pixels_offset =
-                r->fmt.i_y_offset * r->p_picture->p->i_pitch +
-                r->fmt.i_x_offset * r->p_picture->p->i_pixel_pitch;
+                r->source_offset_y * r->p_picture->p->i_pitch +
+                r->source_offset_x * r->p_picture->p->i_pixel_pitch;
             if (!glr->texture)
             {
                 /* Could not recycle a previous texture, generate a new one. */
@@ -294,11 +292,11 @@ vlc_gl_sub_renderer_Prepare(struct vlc_gl_sub_renderer 
*sr,
                     break;
             }
             /* Use the visible pitch of the region */
-            r->p_picture->p[0].i_visible_pitch = r->fmt.i_visible_width
+            r->p_picture->p[0].i_visible_pitch = 
r->p_picture->format.i_visible_width
                                                * 
r->p_picture->p[0].i_pixel_pitch;
 
-            GLsizei width = r->fmt.i_visible_width;
-            GLsizei height = r->fmt.i_visible_height;
+            GLsizei width = r->p_picture->format.i_visible_width;
+            GLsizei height = r->p_picture->format.i_visible_height;
             int ret = interop->ops->update_textures(interop, &glr->texture,
                                                     &width, &height,
                                                     r->p_picture, 
&pixels_offset);


=====================================
modules/video_output/win32/direct3d11.cpp
=====================================
@@ -1332,10 +1332,8 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, 
int *subpicture_region_co
     if (sys->regionQuad.generic.textureFormat == NULL)
         return VLC_EGENERIC;
 
-    int count = 0;
-    const subpicture_region_t *r;
-    vlc_spu_regions_foreach_const(r, &subpicture->regions)
-        count++;
+    size_t count = subpicture->regions.size;
+    const struct subpicture_region_rendered *r;
 
     *region = static_cast<picture_t**>(calloc(count, sizeof(picture_t *)));
     if (unlikely(*region==NULL))
@@ -1343,8 +1341,8 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, 
int *subpicture_region_co
     *subpicture_region_count = count;
 
     int i = 0;
-    vlc_spu_regions_foreach_const(r, &subpicture->regions) {
-        if (!r->fmt.i_visible_width || !r->fmt.i_visible_height)
+    vlc_vector_foreach(r, &subpicture->regions) {
+        if (!r->place.width || !r->place.height)
         {
             i++;
             continue; // won't render anything, keep the cache for later
@@ -1380,7 +1378,7 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, 
int *subpicture_region_co
             if (AllocateTextures(vd, sys->d3d_dev, 
sys->regionQuad.generic.textureFormat, &r->p_picture->format,
                                  false, d3dquad->picSys.texture, NULL)) {
                 msg_Err(vd, "Failed to allocate %dx%d texture for OSD",
-                        r->fmt.i_visible_width, r->fmt.i_visible_height);
+                        r->p_picture->format.i_width, 
r->p_picture->format.i_height);
                 for (int j=0; j<DXGI_MAX_SHADER_VIEW; j++)
                     if (d3dquad->picSys.texture[j])
                         d3dquad->picSys.texture[j]->Release();
@@ -1393,7 +1391,7 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, 
int *subpicture_region_co
                                            d3dquad->picSys.texture, 0,
                                            d3dquad->picSys.renderSrc)) {
                 msg_Err(vd, "Failed to create %dx%d shader view for OSD",
-                        r->fmt.i_visible_width, r->fmt.i_visible_height);
+                        r->p_picture->format.i_width, 
r->p_picture->format.i_height);
                 delete d3dquad;
                 i++;
                 continue;
@@ -1406,7 +1404,7 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, 
int *subpicture_region_co
             if (err != VLC_SUCCESS)
             {
                 msg_Err(vd, "Failed to allocate %dx%d quad for OSD",
-                             r->fmt.i_visible_width, r->fmt.i_visible_height);
+                             r->p_picture->format.i_width, 
r->p_picture->format.i_height);
                 delete d3dquad;
                 i++;
                 continue;
@@ -1415,7 +1413,7 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, 
int *subpicture_region_co
             err = D3D11_SetupQuad( vd, sys->d3d_dev, &r->p_picture->format, 
d3dquad, &sys->display );
             if (err != VLC_SUCCESS) {
                 msg_Err(vd, "Failed to setup %dx%d quad for OSD",
-                        r->fmt.i_visible_width, r->fmt.i_visible_height);
+                        r->p_picture->format.i_width, 
r->p_picture->format.i_height);
                 delete d3dquad;
                 i++;
                 continue;
@@ -1426,7 +1424,11 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, 
int *subpicture_region_co
                 res.pf_destroy = DestroyPictureQuad;
                 return res;
             }((picture_sys_d3d11_t *) d3dquad);
-            (*region)[i] = picture_NewFromResource(&r->p_picture->format, 
&picres);
+            video_format_t no_crop = r->p_picture->format;
+            no_crop.i_x_offset = no_crop.i_y_offset = 0;
+            no_crop.i_visible_width = no_crop.i_width;
+            no_crop.i_visible_height = no_crop.i_height;
+            (*region)[i] = picture_NewFromResource(&no_crop, &picres);
             if ((*region)[i] == NULL) {
                 msg_Err(vd, "Failed to create %dx%d picture for OSD",
                         r->p_picture->format.i_width, 
r->p_picture->format.i_height);
@@ -1462,19 +1464,19 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, 
int *subpicture_region_co
         }
 
         RECT output;
-        output.left   = r->fmt.i_x_offset;
-        output.right  = r->fmt.i_x_offset + r->fmt.i_visible_width;
-        output.top    = r->fmt.i_y_offset;
-        output.bottom = r->fmt.i_y_offset + r->fmt.i_visible_height;
+        output.left   = r->source_offset_x;
+        output.right  = r->source_offset_x + r->place.width;
+        output.top    = r->source_offset_y;
+        output.bottom = r->source_offset_y + r->place.height;
 
         D3D11_UpdateQuadPosition(vd, sys->d3d_dev, quad, &output,
             video_format_GetTransform(ORIENT_NORMAL, 
sys->display.orientation));
 
         RECT spuViewport;
-        spuViewport.left   = (FLOAT) r->i_x * sys->area.place.width  / 
subpicture->i_original_picture_width;
-        spuViewport.top    = (FLOAT) r->i_y * sys->area.place.height / 
subpicture->i_original_picture_height;
-        spuViewport.right  = (FLOAT) (r->i_x + r->fmt.i_visible_width)  * 
sys->area.place.width  / subpicture->i_original_picture_width;
-        spuViewport.bottom = (FLOAT) (r->i_y + r->fmt.i_visible_height) * 
sys->area.place.height / subpicture->i_original_picture_height;
+        spuViewport.left   = (FLOAT) r->place.x * sys->area.place.width  / 
subpicture->i_original_picture_width;
+        spuViewport.top    = (FLOAT) r->place.y * sys->area.place.height / 
subpicture->i_original_picture_height;
+        spuViewport.right  = (FLOAT) (r->place.x + r->place.width)  * 
sys->area.place.width  / subpicture->i_original_picture_width;
+        spuViewport.bottom = (FLOAT) (r->place.y + r->place.height) * 
sys->area.place.height / subpicture->i_original_picture_height;
 
         if (r->zoom_h.num != 0 && r->zoom_h.den != 0)
         {


=====================================
modules/video_output/win32/direct3d9.c
=====================================
@@ -866,10 +866,8 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd,
 {
     vout_display_sys_t *sys = vd->sys;
 
-    size_t count = 0;
-    const subpicture_region_t *r;
-    vlc_spu_regions_foreach_const(r, &subpicture->regions)
-        count++;
+    size_t count = subpicture->regions.size;
+    const struct subpicture_region_rendered *r;
 
     *count_ptr = count;
     *region    = calloc(count, sizeof(**region));
@@ -879,7 +877,7 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd,
     }
 
     int i = 0;
-    vlc_spu_regions_foreach_const(r, &subpicture->regions) {
+    vlc_vector_foreach(r, &subpicture->regions) {
         d3d_region_t *d3dr = &(*region)[i];
         HRESULT hr;
 
@@ -960,10 +958,10 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd,
         const float scale_h = (float)(sys->area.place.height) / 
subpicture->i_original_picture_height;
 
         RECT rect_in_display;
-        rect_in_display.left   =            scale_w * r->i_x,
-        rect_in_display.right  = rect_in_display.left + scale_w * 
r->fmt.i_visible_width,
-        rect_in_display.top    =            scale_h * r->i_y,
-        rect_in_display.bottom = rect_in_display.top  + scale_h * 
r->fmt.i_visible_height;
+        rect_in_display.left   =            scale_w * r->place.x,
+        rect_in_display.right  = rect_in_display.left + scale_w * 
r->place.width,
+        rect_in_display.top    =            scale_h * r->place.y,
+        rect_in_display.bottom = rect_in_display.top  + scale_h * 
r->place.height;
 
         rect_in_display.left   += sys->area.place.x;
         rect_in_display.right  += sys->area.place.x;
@@ -977,10 +975,10 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd,
         texture_rect.bottom = r->p_picture->format.i_height;
 
         RECT texture_visible_rect;
-        texture_visible_rect.left   = r->fmt.i_x_offset;
-        texture_visible_rect.right  = r->fmt.i_x_offset + 
r->fmt.i_visible_width;
-        texture_visible_rect.top    = r->fmt.i_y_offset;
-        texture_visible_rect.bottom = r->fmt.i_y_offset + 
r->fmt.i_visible_height;
+        texture_visible_rect.left   = r->source_offset_x;
+        texture_visible_rect.right  = r->source_offset_x + r->place.width;
+        texture_visible_rect.top    = r->source_offset_y;
+        texture_visible_rect.bottom = r->source_offset_y + r->place.height;
 
         Direct3D9SetupVertices(d3dr->vertex, &texture_rect, 
&texture_visible_rect,
                               &rect_in_display, r->i_alpha, ORIENT_NORMAL);


=====================================
modules/video_output/xcb/render.c
=====================================
@@ -112,7 +112,7 @@ static void PictureDetach(vout_display_t *vd)
 }
 
 static void RenderRegion(vout_display_t *vd, const vlc_render_subpicture 
*subpic,
-                         const subpicture_region_t *reg)
+                         const struct subpicture_region_rendered *reg)
 {
     vout_display_sys_t *sys = vd->sys;
     xcb_connection_t *conn = sys->conn;
@@ -162,20 +162,20 @@ static void RenderRegion(vout_display_t *vd, const 
vlc_render_subpicture *subpic
     /* Mask in the original alpha channel then renver over the scaled pixmap.
      * Mask (pre)multiplies RGB channels and restores the alpha channel.
      */
-    int_fast16_t dx = place->x + reg->i_x * place->width
+    int_fast16_t dx = place->x + reg->place.x * place->width
                       / subpic->i_original_picture_width;
-    int_fast16_t dy = place->y + reg->i_y * place->height
+    int_fast16_t dy = place->y + reg->place.y * place->height
                       / subpic->i_original_picture_height;
-    uint_fast16_t dw = (reg->i_x + reg->fmt.i_visible_width) * place->width
+    uint_fast16_t dw = (reg->place.x + reg->place.width) * place->width
                        / subpic->i_original_picture_width;
-    uint_fast16_t dh = (reg->i_y + reg->fmt.i_visible_height) * place->height
+    uint_fast16_t dh = (reg->place.y + reg->place.height) * place->height
                        / subpic->i_original_picture_height;
 
     xcb_render_composite(conn, XCB_RENDER_PICT_OP_OVER,
                          sys->picture.subpic, sys->picture.alpha,
                          sys->picture.scale,
-                         reg->fmt.i_x_offset, reg->fmt.i_y_offset,
-                         reg->fmt.i_x_offset, reg->fmt.i_y_offset,
+                         reg->source_offset_x, reg->source_offset_y,
+                         reg->source_offset_x, reg->source_offset_y,
                          dx, dy, dw, dh);
 
     xcb_render_free_picture(conn, sys->picture.alpha);
@@ -236,8 +236,8 @@ static void Prepare(vout_display_t *vd, picture_t *pic,
     /* Blend subpictures */
     if (subpic != NULL)
     {
-        const subpicture_region_t *r;
-        vlc_spu_regions_foreach_const(r, &subpic->regions)
+        const struct subpicture_region_rendered *r;
+        vlc_vector_foreach(r, &subpic->regions)
             RenderRegion(vd, subpic, r);
     }
 


=====================================
src/misc/subpicture.c
=====================================
@@ -105,13 +105,19 @@ vlc_render_subpicture *vlc_render_subpicture_New( void )
         return NULL;
     p_subpic->i_original_picture_width = 0;
     p_subpic->i_original_picture_height = 0;
-    vlc_spu_regions_init(&p_subpic->regions);
+    vlc_vector_init(&p_subpic->regions);
     return p_subpic;
 }
 
 void vlc_render_subpicture_Delete( vlc_render_subpicture *p_subpic )
 {
-    vlc_spu_regions_Clear( &p_subpic->regions );
+    struct subpicture_region_rendered *p_region;
+    vlc_vector_foreach(p_region, &p_subpic->regions)
+    {
+        picture_Release( p_region->p_picture );
+        free( p_region );
+    }
+    vlc_vector_clear( &p_subpic->regions );
     free( p_subpic );
 }
 
@@ -220,8 +226,6 @@ static subpicture_region_t * subpicture_region_NewInternal( 
void )
     if( unlikely(p_region == NULL) )
         return NULL;
 
-    p_region->zoom_h.den = p_region->zoom_h.num = 1;
-    p_region->zoom_v.den = p_region->zoom_v.num = 1;
     p_region->i_alpha = 0xff;
     p_region->i_x = INT_MAX;
     p_region->i_y = INT_MAX;
@@ -354,21 +358,19 @@ unsigned picture_BlendSubpicture(picture_t *dst,
 
     assert(src);
 
-    subpicture_region_t *r;
-    vlc_spu_regions_foreach(r, &src->regions) {
-        assert(r->p_picture && r->i_align == 0);
+    struct subpicture_region_rendered *r;
+    vlc_vector_foreach(r, &src->regions) {
+        assert(r->p_picture);
 
         video_format_t blend_fmt = r->p_picture->format;
-        blend_fmt.i_x_offset = r->fmt.i_x_offset;
-        blend_fmt.i_y_offset = r->fmt.i_y_offset;
-        blend_fmt.i_visible_width = r->fmt.i_visible_width;
-        blend_fmt.i_visible_height = r->fmt.i_visible_height;
-        blend_fmt.i_sar_num = r->fmt.i_sar_num;
-        blend_fmt.i_sar_den = r->fmt.i_sar_den;
+        blend_fmt.i_x_offset = r->source_offset_x;
+        blend_fmt.i_y_offset = r->source_offset_y;
+        blend_fmt.i_visible_width = r->place.width;
+        blend_fmt.i_visible_height = r->place.height;
 
         if (filter_ConfigureBlend(blend, dst->format.i_width,
                                   dst->format.i_height,  &blend_fmt)
-         || filter_Blend(blend, dst, r->i_x, r->i_y, r->p_picture, r->i_alpha))
+         || filter_Blend(blend, dst, r->place.x, r->place.y, r->p_picture, 
r->i_alpha))
             msg_Err(blend, "blending %4.4s to %4.4s failed",
                     (char *)&blend->fmt_in.video.i_chroma,
                     (char *)&blend->fmt_out.video.i_chroma );


=====================================
src/video_output/vout_subpictures.c
=====================================
@@ -862,7 +862,7 @@ spu_SelectSubpictures(spu_t *spu, vlc_tick_t system_now,
 /**
  * It will transform the provided region into another region suitable for 
rendering.
  */
-static subpicture_region_t *SpuRenderRegion(spu_t *spu,
+static struct subpicture_region_rendered *SpuRenderRegion(spu_t *spu,
                             spu_area_t *dst_area,
                             const spu_render_entry_t *entry, 
subpicture_region_t *region,
                             const spu_scale_t scale_size,
@@ -1173,13 +1173,23 @@ static subpicture_region_t *SpuRenderRegion(spu_t *spu,
         y_offset = __MAX(y, 0);
     }
 
-    subpicture_region_t *dst = subpicture_region_ForPicture(&region_fmt, 
region_picture);
-    if (dst == NULL)
+    struct subpicture_region_rendered *dst = calloc(1, sizeof(*dst));
+    if (unlikely(dst == NULL))
         return NULL;
-
-    dst->i_x       = x_offset;
-    dst->i_y       = y_offset;
-    dst->i_align   = 0;
+    dst->p_picture = picture_Hold(region_picture);
+    if (unlikely(dst->p_picture == NULL))
+    {
+        free(dst);
+        return NULL;
+    }
+    dst->source_offset_x = region_fmt.i_x_offset;
+    dst->source_offset_y = region_fmt.i_y_offset;
+    dst->place.x    = x_offset;
+    dst->place.y    = y_offset;
+    dst->place.width  = region_fmt.i_visible_width;
+    dst->place.height = region_fmt.i_visible_height;
+    dst->zoom_h.den = dst->zoom_h.num = 1;
+    dst->zoom_v.den = dst->zoom_v.num = 1;
     int fade_alpha = 255;
     if (subpic->b_fade) {
         vlc_tick_t fade_start = subpic->i_start + 3 * (subpic->i_stop - 
subpic->i_start) / 4;
@@ -1245,7 +1255,7 @@ static vlc_render_subpicture *SpuRenderSubpictures(spu_t 
*spu,
     output->i_order = p_entries[i_subpicture - 1].subpic->i_order;
     output->i_original_picture_width  = fmt_dst->i_visible_width;
     output->i_original_picture_height = fmt_dst->i_visible_height;
-    subpicture_region_t *output_last_ptr;
+    struct subpicture_region_rendered *output_last_ptr;
 
     /* Allocate area array for subtitle overlap */
     spu_area_t subtitle_area_buffer[100];
@@ -1348,7 +1358,7 @@ static vlc_render_subpicture *SpuRenderSubpictures(spu_t 
*spu,
                 }
             }
 
-            vlc_spu_regions_push(&output->regions, output_last_ptr);
+            vlc_vector_push(&output->regions, output_last_ptr);
 
             if (subpic->b_subtitle) {
                 area = spu_area_unscaled(area, scale);


=====================================
test/modules/video_output/opengl/sub_renderer.c
=====================================
@@ -178,9 +178,15 @@ static void test_opengl_offscreen(
     subpicture->i_original_picture_width = 4;
     subpicture->i_original_picture_height = 4;
 
-    subpicture_region_t *p_region = subpicture_region_ForPicture(NULL, 
picture);
+    struct subpicture_region_rendered *p_region = calloc(1, sizeof(*p_region));
     assert(p_region != NULL);
-    vlc_spu_regions_push( &subpicture->regions, p_region );
+    p_region->p_picture = picture_Hold(picture);
+    p_region->place.width  = picture->format.i_visible_width;
+    p_region->place.height = picture->format.i_visible_height;
+    p_region->i_alpha = 255;
+    p_region->zoom_h.num = p_region->zoom_h.num = 1;
+    p_region->zoom_v.num = p_region->zoom_v.num = 1;
+    vlc_vector_push( &subpicture->regions, p_region );
 
     ret = vlc_gl_sub_renderer_Prepare(sr, subpicture);
     assert(ret == VLC_SUCCESS);



View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/f2fca0cba80d187130b408d6b65928671fb1046e...3dc2d0186cc52a83ccc9f270d626c83f8a8dd40a

-- 
View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/f2fca0cba80d187130b408d6b65928671fb1046e...3dc2d0186cc52a83ccc9f270d626c83f8a8dd40a
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance
_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to