]> git.sesse.net Git - vlc/commitdiff
Clean up a bit subpicture region API.
authorLaurent Aimar <fenrir@videolan.org>
Sat, 20 Sep 2008 21:51:02 +0000 (23:51 +0200)
committerLaurent Aimar <fenrir@videolan.org>
Sat, 20 Sep 2008 22:21:39 +0000 (00:21 +0200)
27 files changed:
include/vlc_osd.h
include/vlc_vout.h
modules/codec/cc.c
modules/codec/csri.c
modules/codec/cvdsub.c
modules/codec/dvbsub.c
modules/codec/kate.c
modules/codec/libass.c
modules/codec/spudec/parse.c
modules/codec/subtitles/subsdec.c
modules/codec/subtitles/subsusf.c
modules/codec/svcdsub.c
modules/codec/telx.c
modules/codec/zvbi.c
modules/video_filter/dynamicoverlay/dynamicoverlay.c
modules/video_filter/logo.c
modules/video_filter/marq.c
modules/video_filter/mosaic.c
modules/video_filter/osdmenu.c
modules/video_filter/remoteosd.c
modules/video_filter/rss.c
src/libvlccore.sym
src/osd/osd_text.c
src/osd/osd_widgets.c
src/video_output/video_text.c
src/video_output/vout_intf.c
src/video_output/vout_subpictures.c

index d1322f7b7731320b7a2131c689e5966441a54b59..d90fc559f11a829b01a5f55aa9d4e3e91794e4f7 100644 (file)
@@ -118,10 +118,6 @@ VLC_EXPORT( subpicture_t *, spu_CreateSubpicture, ( spu_t * ) );
 VLC_EXPORT( void, spu_DestroySubpicture, ( spu_t *, subpicture_t * ) );
 VLC_EXPORT( void, spu_DisplaySubpicture, ( spu_t *, subpicture_t * ) );
 
-#define spu_CreateRegion(a,b) __spu_CreateRegion(VLC_OBJECT(a),b)
-VLC_EXPORT( subpicture_region_t *,__spu_CreateRegion, ( vlc_object_t *, video_format_t * ) );
-#define spu_DestroyRegion(a,b) __spu_DestroyRegion(VLC_OBJECT(a),b)
-VLC_EXPORT( void, __spu_DestroyRegion, ( vlc_object_t *, subpicture_region_t * ) );
 VLC_EXPORT( subpicture_t *, spu_SortSubpictures, ( spu_t *, mtime_t display_date, bool b_paused, bool b_subtitle_only ) );
 
 /**
index 6c2b6ffef402c8166a7e7a9204fcf209613ef194..c10710aa3482ac0086fabd02602772d90da2b2c6 100644 (file)
@@ -319,9 +319,31 @@ struct subpicture_region_t
     text_style_t    *p_style;        /**< a description of the text style formatting */
 
     subpicture_region_t *p_next;                /**< next region in the list */
-    subpicture_region_private_t *p_private;  /**< modified version of this region */
+    subpicture_region_private_t *p_private;  /**< Private data for spu_t *only* */
 };
 
+/**
+ * This function will create a new subpicture.
+ * You can must use subpicture_region_Delete to destroy it.
+ */
+VLC_EXPORT( subpicture_region_t *, subpicture_region_New, ( const video_format_t *p_fmt ) );
+
+/**
+ * This function will destroy a subpicture allocated by
+ * subpicture_region_New.
+ *
+ * You may give it NULL.
+ */
+VLC_EXPORT( void, subpicture_region_Delete, ( subpicture_region_t *p_region ) );
+
+/**
+ * This function will destroy a list of subpicture allocated by
+ * subpicture_region_New.
+ *
+ * Provided for convenience.
+ */
+VLC_EXPORT( void, subpicture_region_ChainDelete, ( subpicture_region_t *p_head ) );
+
 /**
  * Video subtitle
  *
@@ -375,10 +397,6 @@ struct subpicture_t
     void ( *pf_destroy ) ( subpicture_t * );
 
     /** Pointer to functions for region management */
-    subpicture_region_t * ( *pf_create_region ) ( vlc_object_t *,
-                                                  video_format_t * );
-    void ( *pf_destroy_region ) ( vlc_object_t *, subpicture_region_t * );
-
     void (*pf_pre_render)    ( spu_t *, subpicture_t *, const video_format_t * );
     void (*pf_update_regions)( spu_t *,
                                subpicture_t *, const video_format_t *, mtime_t );
index f575f669f645544c0468c4a615234e66d7dd6c7c..77abe71cb8559ab14f3f97a7b3c7e20eaebb38f4 100644 (file)
@@ -344,7 +344,7 @@ static subpicture_t *Subtitle( decoder_t *p_dec, char *psz_subtitle, char *psz_h
     fmt.i_aspect = 0;
     fmt.i_width = fmt.i_height = 0;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
+    p_spu->p_region = subpicture_region_New( &fmt );
     if( !p_spu->p_region )
     {
         msg_Err( p_dec, "cannot allocate SPU region" );
index 919e086f628c3dd28f8d0b9a9d71850383db7163..681a671aaf4df3f395c28d4a2246de2af4a18f07 100644 (file)
@@ -250,12 +250,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic,
     video_format_t fmt;
 
     /* TODO maybe checking if we really need redrawing */
-    while( p_subpic->p_region )
-    {
-        subpicture_region_t *p_region = p_subpic->p_region;
-        p_subpic->p_region = p_region->p_next;
-        spu_DestroyRegion( p_spu, p_region );
-    }
+    subpicture_region_ChainDelete( p_subpic->p_region );
     p_subpic->p_region = NULL;
 
     /* FIXME check why this is needed */
@@ -297,7 +292,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic,
     p_subpic->i_original_picture_height = fmt.i_height;
     p_subpic->i_original_picture_width = fmt.i_width;
 
-    p_spu_region = p_subpic->p_region = p_subpic->pf_create_region( VLC_OBJECT(p_dec), &fmt );
+    p_spu_region = p_subpic->p_region = subpicture_region_New( &fmt );
 
     if( p_spu_region )
     {
index eb934b5ca75143e70f1ad277c1779ac3410f2b43..e5f31496b523847a2e0b774135c3a8a492cc31cb 100644 (file)
@@ -498,6 +498,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
     subpicture_t  *p_spu;
     subpicture_region_t *p_region;
     video_format_t fmt;
+    video_palette_t palette;
     int i;
 
     /* Allocate the subpicture internal data. */
@@ -515,11 +516,22 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
     fmt.i_width = fmt.i_visible_width = p_sys->i_width;
     fmt.i_height = fmt.i_visible_height = p_sys->i_height;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
+    fmt.p_palette = &palette;
+    fmt.p_palette->i_entries = 4;
+    for( i = 0; i < fmt.p_palette->i_entries; i++ )
+    {
+        fmt.p_palette->palette[i][0] = p_sys->p_palette[i][0];
+        fmt.p_palette->palette[i][1] = p_sys->p_palette[i][1];
+        fmt.p_palette->palette[i][2] = p_sys->p_palette[i][2];
+        fmt.p_palette->palette[i][3] = p_sys->p_palette[i][3];
+    }
+
+    p_region = subpicture_region_New( &fmt );
     if( !p_region )
     {
         msg_Err( p_dec, "cannot allocate SPU region" );
-        //goto error;
+        p_dec->pf_spu_buffer_del( p_dec, p_spu );
+        return NULL;
     }
 
     p_spu->p_region = p_region;
@@ -527,16 +539,6 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
     p_region->i_x = p_region->i_x * 3 / 4; /* FIXME: use aspect ratio for x? */
     p_region->i_y = p_sys->i_y_start;
 
-    /* Build palette */
-    fmt.p_palette->i_entries = 4;
-    for( i = 0; i < fmt.p_palette->i_entries; i++ )
-    {
-        fmt.p_palette->palette[i][0] = p_sys->p_palette[i][0];
-        fmt.p_palette->palette[i][1] = p_sys->p_palette[i][1];
-        fmt.p_palette->palette[i][2] = p_sys->p_palette[i][2];
-        fmt.p_palette->palette[i][3] = p_sys->p_palette[i][3];
-    }
-
     RenderImage( p_dec, p_data, p_region );
 
     return p_spu;
index baf589c101115745cbca36c7fadc4d7664016c8f..9937a6a6266274dfeaf1f9f184f7f65cc9e0e89d 100644 (file)
@@ -1500,6 +1500,7 @@ static subpicture_t *render( decoder_t *p_dec )
         subpicture_region_t *p_spu_region;
         uint8_t *p_src, *p_dst;
         video_format_t fmt;
+        video_palette_t palette;
         int i_pitch;
 
         i_timeout = p_sys->p_page->i_timeout;
@@ -1545,19 +1546,7 @@ static subpicture_t *render( decoder_t *p_dec )
         fmt.i_width = fmt.i_visible_width = p_region->i_width;
         fmt.i_height = fmt.i_visible_height = p_region->i_height;
         fmt.i_x_offset = fmt.i_y_offset = 0;
-        p_spu_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
-        if( !p_spu_region )
-        {
-            msg_Err( p_dec, "cannot allocate SPU region" );
-            continue;
-        }
-        p_spu_region->i_x = i_base_x + p_regiondef->i_x;
-        p_spu_region->i_y = i_base_y + p_regiondef->i_y;
-        p_spu_region->i_align = p_sys->i_spu_position;
-        *pp_spu_region = p_spu_region;
-        pp_spu_region = &p_spu_region->p_next;
-
-        /* Build palette */
+        fmt.p_palette = &palette;
         fmt.p_palette->i_entries = ( p_region->i_depth == 1 ) ? 4 :
             ( ( p_region->i_depth == 2 ) ? 16 : 256 );
         p_color = ( p_region->i_depth == 1 ) ? p_clut->c_2b :
@@ -1570,6 +1559,18 @@ static subpicture_t *render( decoder_t *p_dec )
             fmt.p_palette->palette[j][3] = 0xff - p_color[j].T;
         }
 
+        p_spu_region = subpicture_region_New( &fmt );
+        if( !p_spu_region )
+        {
+            msg_Err( p_dec, "cannot allocate SPU region" );
+            continue;
+        }
+        p_spu_region->i_x = i_base_x + p_regiondef->i_x;
+        p_spu_region->i_y = i_base_y + p_regiondef->i_y;
+        p_spu_region->i_align = p_sys->i_spu_position;
+        *pp_spu_region = p_spu_region;
+        pp_spu_region = &p_spu_region->p_next;
+
         p_src = p_region->p_pixbuf;
         p_dst = p_spu_region->p_picture->Y_PIXELS;
         i_pitch = p_spu_region->p_picture->Y_PITCH;
@@ -1598,7 +1599,7 @@ static subpicture_t *render( decoder_t *p_dec )
             fmt.i_width = fmt.i_visible_width = p_region->i_width;
             fmt.i_height = fmt.i_visible_height = p_region->i_height;
             fmt.i_x_offset = fmt.i_y_offset = 0;
-            p_spu_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
+            p_spu_region = subpicture_region_New( &fmt );
             if( !p_region )
             {
                 msg_Err( p_dec, "cannot allocate SPU region" );
index b8646aef1cea6b578da0a4ea90dd0df9554e9491..be89e97ddd3289fc44ad0cd16aa38c4c364000b7 100644 (file)
@@ -552,6 +552,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
     subpicture_region_t *p_bitmap_region = NULL;
     int ret;
     video_format_t fmt;
+    video_format_t palette;
     kate_tracker kin;
     bool tracker_valid = false;
 
@@ -620,6 +621,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
 
 #ifdef ENABLE_BITMAPS
     if (ev->bitmap && ev->bitmap->type==kate_bitmap_type_paletted && ev->palette) {
+
         /* create a separate region for the bitmap */
         memset( &fmt, 0, sizeof(video_format_t) );
         fmt.i_chroma = VLC_FOURCC('Y','U','V','P');
@@ -627,8 +629,10 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
         fmt.i_width = fmt.i_visible_width = ev->bitmap->width;
         fmt.i_height = fmt.i_visible_height = ev->bitmap->height;
         fmt.i_x_offset = fmt.i_y_offset = 0;
+        fmt.p_palette = &palette;
+        CreateKatePalette( fmt.p_palette, ev->palette );
 
-        p_bitmap_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
+        p_bitmap_region = subpicture_region_New( &fmt );
         if( !p_bitmap_region )
         {
             msg_Err( p_dec, "cannot allocate SPU region" );
@@ -636,9 +640,6 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
             return NULL;
         }
 
-        /* create the palette */
-        CreateKatePalette( fmt.p_palette, ev->palette );
-
         /* create the bitmap */
         CreateKateBitmap( p_bitmap_region->p_picture, ev->bitmap );
 
@@ -651,7 +652,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
     fmt.i_aspect = 0;
     fmt.i_width = fmt.i_height = 0;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
+    p_spu->p_region = subpicture_region_New( &fmt );
     if( !p_spu->p_region )
     {
         msg_Err( p_dec, "cannot allocate SPU region" );
index 38242bf61831cb4f25c4259ae39c64f6152b48d9..754ec54da6dd07e74129702551720a49e2eec181 100644 (file)
@@ -399,7 +399,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic,
         fmt_region.i_height =
         fmt_region.i_visible_height = region[i].y1 - region[i].y0;
 
-        pp_region[i] = r = p_subpic->pf_create_region( VLC_OBJECT(p_spu), &fmt_region );
+        pp_region[i] = r = subpicture_region_New( &fmt_region );
         if( !r )
             break;
         r->i_x = region[i].x0;
@@ -620,12 +620,7 @@ static void RegionDraw( subpicture_region_t *p_region, ass_image_t *p_img )
 
 static void SubpictureReleaseRegions( spu_t *p_spu, subpicture_t *p_subpic )
 {
-    while( p_subpic->p_region )
-    {
-        subpicture_region_t *p_region = p_subpic->p_region;
-        p_subpic->p_region = p_region->p_next;
-        spu_DestroyRegion( p_spu, p_region );
-    }
+    subpicture_region_ChainDelete( p_subpic->p_region );
     p_subpic->p_region = NULL;
 }
 
index 4e118e02b180af03793a7989899e57e3446f2d82..f2c404faaccd0dc3ccca024f9ddf6b4f8b0dc691 100644 (file)
@@ -658,6 +658,7 @@ static void Render( decoder_t *p_dec, subpicture_t *p_spu,
     int i_x, i_y, i_len, i_color, i_pitch;
     uint16_t *p_source = (uint16_t *)p_spu_data->p_data;
     video_format_t fmt;
+    video_palette_t palette;
 
     /* Create a new subpicture region */
     memset( &fmt, 0, sizeof(video_format_t) );
@@ -667,19 +668,7 @@ static void Render( decoder_t *p_dec, subpicture_t *p_spu,
     fmt.i_height = fmt.i_visible_height = p_spu_properties->i_height -
         p_spu_data->i_y_top_offset - p_spu_data->i_y_bottom_offset;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
-    if( !p_spu->p_region )
-    {
-        msg_Err( p_dec, "cannot allocate SPU region" );
-        return;
-    }
-
-    p_spu->p_region->i_x = p_spu_properties->i_x;
-    p_spu->p_region->i_y = p_spu_properties->i_y + p_spu_data->i_y_top_offset;
-    p_p = p_spu->p_region->p_picture->p->p_pixels;
-    i_pitch = p_spu->p_region->p_picture->p->i_pitch;
-
-    /* Build palette */
+    fmt.p_palette = &palette;
     fmt.p_palette->i_entries = 4;
     for( i_x = 0; i_x < fmt.p_palette->i_entries; i_x++ )
     {
@@ -691,6 +680,18 @@ static void Render( decoder_t *p_dec, subpicture_t *p_spu,
             p_spu_data->pi_alpha[i_x] << 4;
     }
 
+    p_spu->p_region = subpicture_region_New( &fmt );
+    if( !p_spu->p_region )
+    {
+        msg_Err( p_dec, "cannot allocate SPU region" );
+        return;
+    }
+
+    p_spu->p_region->i_x = p_spu_properties->i_x;
+    p_spu->p_region->i_y = p_spu_properties->i_y + p_spu_data->i_y_top_offset;
+    p_p = p_spu->p_region->p_picture->p->p_pixels;
+    i_pitch = p_spu->p_region->p_picture->p->i_pitch;
+
     /* Draw until we reach the bottom of the subtitle */
     for( i_y = 0; i_y < (int)fmt.i_height * i_pitch; i_y += i_pitch )
     {
index b502f8b42c9f03438619a233d3f5198257689ed1..4e053a149a5bc2efb9432db67b4fbccad60d84d1 100644 (file)
@@ -418,7 +418,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
     fmt.i_aspect = 0;
     fmt.i_width = fmt.i_height = 0;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
+    p_spu->p_region = subpicture_region_New( &fmt );
     if( !p_spu->p_region )
     {
         msg_Err( p_dec, "cannot allocate SPU region" );
index b03be78b8d6661ed11a0c60cb302405eb37412d3..45bebedf7de9f446680652a8f9951c6003b371a9 100644 (file)
@@ -386,7 +386,7 @@ static subpicture_region_t *CreateTextRegion( decoder_t *p_dec,
     fmt.i_aspect = 0;
     fmt.i_width = fmt.i_height = 0;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_text_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
+    p_text_region = subpicture_region_New( &fmt );
 
     if( p_text_region != NULL )
     {
@@ -396,7 +396,7 @@ static subpicture_region_t *CreateTextRegion( decoder_t *p_dec,
         p_text_region->psz_html = strndup( psz_subtitle, i_len );
         if( ! p_text_region->psz_html )
         {
-            p_spu->pf_destroy_region( VLC_OBJECT(p_dec), p_text_region );
+            subpicture_region_Delete( p_text_region );
             return NULL;
         }
 
@@ -1201,7 +1201,7 @@ static subpicture_region_t *LoadEmbeddedImage( decoder_t *p_dec,
     fmt_out.i_height =
         fmt_out.i_visible_height = p_pic->format.i_visible_height;
 
-    p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt_out );
+    p_region = subpicture_region_New( &fmt_out );
     if( !p_region )
     {
         msg_Err( p_dec, "cannot allocate SPU region" );
index 5a1ecbfb8ee42400176af1b3e8718271ba7b16bd..c8572bdbd8cb605a650adba2e531a3838e968bc9 100644 (file)
@@ -467,6 +467,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
     subpicture_t  *p_spu;
     subpicture_region_t *p_region;
     video_format_t fmt;
+    video_palette_t palette;
     int i;
 
     /* Allocate the subpicture internal data. */
@@ -494,20 +495,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
     fmt.i_width = fmt.i_visible_width = p_sys->i_width;
     fmt.i_height = fmt.i_visible_height = p_sys->i_height;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
-    if( !p_region )
-    {
-        msg_Err( p_dec, "cannot allocate SVCD subtitle region" );
-        //goto error;
-    }
-
-    p_region->fmt.i_aspect = VOUT_ASPECT_FACTOR;
-    p_spu->p_region = p_region;
-    p_region->i_x = p_sys->i_x_start;
-    p_region->i_y = p_sys->i_y_start;
-
-    /* Build palette */
+    fmt.p_palette = &palette;
     fmt.p_palette->i_entries = 4;
     for( i = 0; i < fmt.p_palette->i_entries; i++ )
     {
@@ -517,6 +505,18 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
         fmt.p_palette->palette[i][3] = p_sys->p_palette[i][3];
     }
 
+    p_region = subpicture_region_New( &fmt );
+    if( !p_region )
+    {
+        msg_Err( p_dec, "cannot allocate SVCD subtitle region" );
+        p_dec->pf_spu_buffer_del( p_dec, p_spu );
+        return NULL;
+    }
+
+    p_spu->p_region = p_region;
+    p_region->i_x = p_sys->i_x_start;
+    p_region->i_y = p_sys->i_y_start;
+
     SVCDSubRenderImage( p_dec, p_data, p_region );
 
     return p_spu;
index 6da895d0d279acc5da1915c9f4243884c9683c67..a0ab9068eb23a7274aa29f9c34cafa9bb4e367c3 100644 (file)
@@ -708,7 +708,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
     fmt.i_aspect = 0;
     fmt.i_width = fmt.i_height = 0;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
+    p_spu->p_region = subpicture_region_New( &fmt );
     if( p_spu->p_region == NULL )
     {
         msg_Err( p_dec, "cannot allocate SPU region" );
index 5e26f457a97b63a2f38dda99a2b28fe2459c31fb..e716f90f1a9ea80675c6f8fdaf052caf2f13fc61 100644 (file)
@@ -483,7 +483,7 @@ static subpicture_t *Subpicture( decoder_t *p_dec, video_format_t *p_fmt,
     }
     fmt.i_x_offset = fmt.i_y_offset = 0;
 
-    p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
+    p_spu->p_region = subpicture_region_New( &fmt );
     if( p_spu->p_region == NULL )
     {
         msg_Err( p_dec, "cannot allocate SPU region" );
index 7c1cc11b8eedd2142b028bca6a242367bcba391d..03a3fd6e1fcfc9f929bdb30b240e9c11d029ff50 100644 (file)
@@ -347,8 +347,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
     {
         subpicture_region_t *p_region;
 
-        *pp_region = p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter),
-                                                         &p_overlay->format );
+        *pp_region = p_region = subpicture_region_New( &p_overlay->format );
         if( !p_region )
             break;
 
index 52de12782095362bf5eeaef9f6bd66b08130de34..4c7594f0c8e7ab73c670e1bf788cf11308368843 100644 (file)
@@ -864,7 +864,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
     fmt.i_width = fmt.i_visible_width = p_pic->p[Y_PLANE].i_visible_pitch;
     fmt.i_height = fmt.i_visible_height = p_pic->p[Y_PLANE].i_visible_lines;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
+    p_region = subpicture_region_New( &fmt );
     if( !p_region )
     {
         msg_Err( p_filter, "cannot allocate SPU region" );
index 030442b65dea8a8cf37096bbbd663ff9d0c6f54d..3accc6312512baf16bf055fa3b93dac8868b7d3f 100644 (file)
@@ -286,7 +286,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
     fmt.i_width = fmt.i_height = 0;
     fmt.i_x_offset = 0;
     fmt.i_y_offset = 0;
-    p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
+    p_spu->p_region = subpicture_region_New( &fmt );
     if( !p_spu->p_region )
     {
         p_filter->pf_sub_buffer_del( p_filter, p_spu );
index 169155d7ab023dc364e31fc64e8177033ef204a6..6bbdb4a0f62f1a9114f0e809a1405d24d4f22889 100644 (file)
@@ -641,10 +641,10 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
             fmt_out.i_visible_height = fmt_out.i_height;
         }
 
-        p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt_out );
+        p_region = subpicture_region_New( &fmt_out );
         /* FIXME the copy is probably not needed anymore */
         if( p_region )
-            picture_Copy( &p_region->p_picture, p_converted );
+            picture_Copy( p_region->p_picture, p_converted );
         if( !p_sys->b_keep )
             picture_Release( p_converted );
 
index b83fa136507a1d55a10b5e69243cb63209f515df..5cf4d0665e7fadef8a73d8353b42800c65a05a15 100644 (file)
@@ -375,7 +375,7 @@ static subpicture_region_t *create_text_region( filter_t *p_filter, subpicture_t
     fmt.i_width = fmt.i_visible_width = i_width;
     fmt.i_height = fmt.i_visible_height = i_height;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
+    p_region = subpicture_region_New( &fmt );
     if( !p_region )
     {
         msg_Err( p_filter, "cannot allocate another SPU region" );
@@ -401,6 +401,7 @@ static subpicture_region_t *create_picture_region( filter_t *p_filter, subpictur
 {
     subpicture_region_t *p_region = NULL;
     video_format_t       fmt;
+    video_palette_t      palette;
 
     if( !p_spu ) return NULL;
 
@@ -412,20 +413,21 @@ static subpicture_region_t *create_picture_region( filter_t *p_filter, subpictur
     fmt.i_width = fmt.i_visible_width = i_width;
     fmt.i_height = fmt.i_visible_height = i_height;
     fmt.i_x_offset = fmt.i_y_offset = 0;
+    if( fmt.i_chroma == VLC_FOURCC('Y','U','V','P') )
+    {
+        fmt.p_palette = &palette;
+        fmt.p_palette->i_entries = 0;
+        fmt.i_visible_width = 0;
+        fmt.i_visible_height = 0;
+    }
 
-    p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
+    p_region = subpicture_region_New( &fmt );
     if( !p_region )
     {
         msg_Err( p_filter, "cannot allocate SPU region" );
         p_filter->pf_sub_buffer_del( p_filter, p_spu );
         return NULL;
     }
-    if( !p_pic && ( fmt.i_chroma == VLC_FOURCC('Y','U','V','P') ) )
-    {
-        p_region->fmt.p_palette->i_entries = 0;
-        p_region->fmt.i_width = p_region->fmt.i_visible_width = 0;
-        p_region->fmt.i_height = p_region->fmt.i_visible_height = 0;
-    }
     /* FIXME the copy is probably not needed anymore */
     if( p_pic )
         picture_Copy( p_region->p_picture, p_pic );
@@ -570,13 +572,9 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t i_date )
             if( !p_new )
             {
                 /* Cleanup when bailing out */
-                subpicture_region_t *p_tmp = NULL;
-                while( p_region_list )
-                {
-                    p_tmp = p_region_list->p_next;
-                    p_spu->pf_destroy_region( VLC_OBJECT(p_filter), p_region_list );
-                };
-                p_spu->pf_destroy_region( VLC_OBJECT(p_filter), p_region );
+                subpicture_region_ChainDelete( p_region_list );
+                subpicture_region_Delete( p_region );
+
                 p_filter->pf_sub_buffer_del( p_filter, p_spu );
                 return NULL;
             }
index 276a999ba70b6872e4ca3d11b7509b7c9daa1475..95e71c2fa7182c6dcb0f2932700b804a9204a102 100644 (file)
@@ -1162,7 +1162,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
     fmt.i_width = fmt.i_visible_width = p_pic->p[Y_PLANE].i_visible_pitch;
     fmt.i_height = fmt.i_visible_height = p_pic->p[Y_PLANE].i_visible_lines;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
+    p_region = subpicture_region_New( &fmt );
     if( !p_region )
     {
         msg_Err( p_filter, "cannot allocate SPU region" );
index 3894d9dac8c637f367bd1087ef5ec5aac66a0722..9639e6e0e72c69192cb0488dc275ea5f5a77116c 100644 (file)
@@ -443,7 +443,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
 
     fmt.i_chroma = VLC_FOURCC('T','E','X','T');
 
-    p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
+    p_spu->p_region = subpicture_region_New( &fmt );
     if( !p_spu->p_region )
     {
         p_filter->pf_sub_buffer_del( p_filter, p_spu );
@@ -548,7 +548,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
         fmt_out.i_height =
             fmt_out.i_visible_height = p_pic->p[Y_PLANE].i_visible_lines;
 
-        p_region = p_spu->pf_create_region( VLC_OBJECT( p_filter ), &fmt_out );
+        p_region = subpicture_region_New( &fmt_out );
         if( !p_region )
         {
             msg_Err( p_filter, "cannot allocate SPU region" );
index e95f1d4830e4dd10126cfb2bd22412ecfbd0e1bc..12a9e2e9a9fa19ae203890499afc02480c9593c9 100644 (file)
@@ -336,10 +336,8 @@ sout_StreamDelete
 sout_StreamNew
 sout_UpdateStatistic
 __spu_Create
-__spu_CreateRegion
 spu_CreateSubpicture
 spu_Destroy
-__spu_DestroyRegion
 spu_DestroySubpicture
 spu_DisplaySubpicture
 spu_Init
@@ -374,6 +372,8 @@ stream_vaControl
 __str_format
 __str_format_meta
 str_format_time
+subpicture_region_New
+subpicture_region_Delete
 tls_ClientCreate
 tls_ClientDelete
 ToLocale
index ea2c969ac4d6919b7fffd127fb694d922b227bb5..0657c2d920cdbac54ead36c303f8c1e90354a2c5 100644 (file)
@@ -94,7 +94,7 @@ int osd_ShowTextAbsolute( spu_t *p_spu_channel, int i_channel,
     fmt.i_aspect = 0;
     fmt.i_width = fmt.i_height = 0;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_spu_channel), &fmt );
+    p_spu->p_region = subpicture_region_New( &fmt );
     if( !p_spu->p_region )
     {
         msg_Err( p_spu_channel, "cannot allocate SPU region" );
index 2d384d1b4cd3f4a16ba1983c77acc7f2d832d3c3..76765165074b73c5571c4f66750326c6f3c762b1 100644 (file)
@@ -164,7 +164,7 @@ static int CreatePicture( spu_t *p_spu, subpicture_t *p_subpic,
     fmt.i_width = fmt.i_visible_width = i_width;
     fmt.i_height = fmt.i_visible_height = i_height;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_subpic->p_region = p_subpic->pf_create_region( VLC_OBJECT(p_spu), &fmt );
+    p_subpic->p_region = subpicture_region_New( &fmt );
     if( !p_subpic->p_region )
     {
         msg_Err( p_spu, "cannot allocate SPU region" );
index a0499bb0e66cf1eb692d3851e9e73c5d757ea965..2fef025debbf7dff8dc1b52e59a7c100fce8307b 100644 (file)
@@ -98,7 +98,7 @@ int vout_ShowTextAbsolute( vout_thread_t *p_vout, int i_channel,
     fmt.i_aspect = 0;
     fmt.i_width = fmt.i_height = 0;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_vout), &fmt );
+    p_spu->p_region = subpicture_region_New( &fmt );
     if( !p_spu->p_region )
     {
         msg_Err( p_vout, "cannot allocate SPU region" );
index a57e88bacca98aaf222855670064136c51bece24..2b95da0dde40451e80938691867f8d8fbb69ec77 100644 (file)
@@ -475,7 +475,7 @@ static int VoutSnapshotPip( vout_thread_t *p_vout, image_handler_t *p_image, pic
     fmt_out.i_sar_num =
     fmt_out.i_sar_den = 0;
 
-    p_subpic->p_region = spu_CreateRegion( p_vout->p_spu, &fmt_out );
+    p_subpic->p_region = subpicture_region_New( &fmt_out );
     if( p_subpic->p_region )
     {
         picture_Release( p_subpic->p_region->p_picture );
index 6988b0ef93ed9d37923809f475d4209fe0ba7ccf..c10b35119f073666c17a517dfd5f8dcef4da585d 100644 (file)
@@ -253,26 +253,21 @@ void spu_Attach( spu_t *p_spu, vlc_object_t *p_this, bool b_attach )
     }
 }
 
-/**
- * Create a subpicture region
- *
- * \param p_this vlc_object_t
- * \param p_fmt the format that this subpicture region should have
- */
-subpicture_region_t *__spu_CreateRegion( vlc_object_t *p_this,
-                                         video_format_t *p_fmt )
+/* */
+subpicture_region_t *subpicture_region_New( const video_format_t *p_fmt )
 {
     subpicture_region_t *p_region = calloc( 1, sizeof(*p_region ) );
     if( !p_region )
         return NULL;
 
-    /* FIXME is that *really* wanted? */
-    if( p_fmt->i_chroma == VLC_FOURCC_YUVP )
-        p_fmt->p_palette = calloc( 1, sizeof(video_palette_t) );
-    else
-        p_fmt->p_palette = NULL;    /* XXX and that above all? */
-
     p_region->fmt = *p_fmt;
+    p_region->fmt.p_palette = NULL;
+    if( p_fmt->i_chroma == VLC_FOURCC_YUVP )
+    {
+        p_region->fmt.p_palette = calloc( 1, sizeof(*p_region->fmt.p_palette) );
+        if( p_fmt->p_palette )
+            *p_region->fmt.p_palette = *p_fmt->p_palette;
+    }
     p_region->i_alpha = 0xff;
     p_region->p_next = NULL;
     p_region->p_private = NULL;
@@ -295,13 +290,8 @@ subpicture_region_t *__spu_CreateRegion( vlc_object_t *p_this,
     return p_region;
 }
 
-/**
- * Destroy a subpicture region
- *
- * \param p_this vlc_object_t
- * \param p_region the subpicture region to destroy
- */
-void __spu_DestroyRegion( vlc_object_t *p_this, subpicture_region_t *p_region )
+/* */
+void subpicture_region_Delete( subpicture_region_t *p_region )
 {
     if( !p_region )
         return;
@@ -320,6 +310,19 @@ void __spu_DestroyRegion( vlc_object_t *p_this, subpicture_region_t *p_region )
     free( p_region );
 }
 
+/* */
+void subpicture_region_ChainDelete( subpicture_region_t *p_head )
+{
+    while( p_head )
+    {
+        subpicture_region_t *p_next = p_head->p_next;
+
+        subpicture_region_Delete( p_head );
+
+        p_head = p_next;
+    }
+}
+
 /**
  * Display a subpicture
  *
@@ -403,9 +406,6 @@ subpicture_t *spu_CreateSubpicture( spu_t *p_spu )
     p_subpic->p_sys      = NULL;
     vlc_mutex_unlock( &p_spu->subpicture_lock );
 
-    p_subpic->pf_create_region = __spu_CreateRegion;
-    p_subpic->pf_destroy_region = __spu_DestroyRegion;
-
     return p_subpic;
 }
 
@@ -437,12 +437,8 @@ void spu_DestroySubpicture( spu_t *p_spu, subpicture_t *p_subpic )
                          p_subpic, p_subpic->i_status );
     }
 
-    while( p_subpic->p_region )
-    {
-        subpicture_region_t *p_region = p_subpic->p_region;
-        p_subpic->p_region = p_region->p_next;
-        spu_DestroyRegion( p_spu, p_region );
-    }
+    subpicture_region_ChainDelete( p_subpic->p_region );
+    p_subpic->p_region = NULL;
 
     if( p_subpic->pf_destroy )
     {
@@ -1543,12 +1539,8 @@ static void SpuClearChannel( spu_t *p_spu, int i_channel, bool b_locked )
 
         if( p_subpic->i_channel == i_channel )
         {
-            while( p_subpic->p_region )
-            {
-                subpicture_region_t *p_region = p_subpic->p_region;
-                p_subpic->p_region = p_region->p_next;
-                spu_DestroyRegion( p_spu, p_region );
-            }
+            subpicture_region_ChainDelete( p_subpic->p_region );
+            p_subpic->p_region = NULL;
 
             if( p_subpic->pf_destroy ) p_subpic->pf_destroy( p_subpic );
             p_subpic->i_status = FREE_SUBPICTURE;
@@ -1676,21 +1668,13 @@ static subpicture_t *spu_new_buffer( filter_t *p_filter )
     p_subpic->b_absolute = true;
     p_subpic->i_alpha    = 0xFF;
 
-    p_subpic->pf_create_region = __spu_CreateRegion;
-    p_subpic->pf_destroy_region = __spu_DestroyRegion;
-
     VLC_UNUSED(p_filter);
     return p_subpic;
 }
 
 static void spu_del_buffer( filter_t *p_filter, subpicture_t *p_subpic )
 {
-    while( p_subpic->p_region )
-    {
-        subpicture_region_t *p_region = p_subpic->p_region;
-        p_subpic->p_region = p_region->p_next;
-        p_subpic->pf_destroy_region( VLC_OBJECT(p_filter), p_region );
-    }
+    subpicture_region_ChainDelete( p_subpic->p_region );
 
     free( p_subpic );
 }