[vlc-devel] [PATCH] vlc_es: unionize audio/video/subs in es_format_t

Thomas Guillem thomas at gllm.fr
Fri Nov 4 18:15:18 CET 2016


---
 include/vlc_es.h     |  8 +++++---
 src/misc/es_format.c | 49 +++++++++++++++++++++++++++++++++----------------
 2 files changed, 38 insertions(+), 19 deletions(-)

diff --git a/include/vlc_es.h b/include/vlc_es.h
index bb86b40..2193b3f 100644
--- a/include/vlc_es.h
+++ b/include/vlc_es.h
@@ -536,10 +536,12 @@ struct es_format_t
     unsigned        i_extra_languages;    /**< length in bytes of extra language data pointer */
     extra_languages_t *p_extra_languages; /**< extra language data needed by some decoders */
 
-    audio_format_t  audio;    /**< description of audio format */
+    union {
+        audio_format_t audio;    /**< description of audio format */
+        video_format_t video;    /**< description of video format */
+        subs_format_t  subs;     /**< description of subtitle format */
+    };
     audio_replay_gain_t audio_replay_gain; /*< audio replay gain information */
-    video_format_t video;     /**< description of video format */
-    subs_format_t  subs;      /**< description of subtitle format */
 
     unsigned int   i_bitrate; /**< bitrate of this ES */
     int      i_profile;       /**< codec specific information (like real audio flavor, mpeg audio layer, h264 profile ...) */
diff --git a/src/misc/es_format.c b/src/misc/es_format.c
index d646e78..5442090 100644
--- a/src/misc/es_format.c
+++ b/src/misc/es_format.c
@@ -499,23 +499,33 @@ int es_format_Copy(es_format_t *restrict dst, const es_format_t *src)
         }
     }
 
-    if (src->subs.psz_encoding != NULL)
+    switch( src->i_cat )
     {
-        dst->subs.psz_encoding = strdup(src->subs.psz_encoding);
-        if (unlikely(dst->subs.psz_encoding == NULL))
-            ret = VLC_ENOMEM;
-    }
-    if (src->subs.p_style != NULL)
-    {
-        dst->subs.p_style = text_style_Duplicate(src->subs.p_style);
-        if (unlikely(dst->subs.p_style == NULL))
-            ret = VLC_ENOMEM;
+        case VIDEO_ES:
+        {
+            int err = video_format_Copy( &dst->video, &src->video );
+            if ( err != VLC_SUCCESS )
+                return err;
+            break;
+        }
+        case SPU_ES:
+            if (src->subs.psz_encoding != NULL)
+            {
+                dst->subs.psz_encoding = strdup(src->subs.psz_encoding);
+                if (unlikely(dst->subs.psz_encoding == NULL))
+                    ret = VLC_ENOMEM;
+            }
+            if (src->subs.p_style != NULL)
+            {
+                dst->subs.p_style = text_style_Duplicate(src->subs.p_style);
+                if (unlikely(dst->subs.p_style == NULL))
+                    ret = VLC_ENOMEM;
+            }
+            break;
+        default:
+            break;
     }
 
-    int err = video_format_Copy( &dst->video, &src->video );
-    if ( err != VLC_SUCCESS )
-        return err;
-
     if (src->i_extra_languages > 0)
     {
         assert(src->p_extra_languages != NULL);
@@ -548,8 +558,15 @@ void es_format_Clean(es_format_t *fmt)
     assert(fmt->i_extra == 0 || fmt->p_extra != NULL);
     free(fmt->p_extra);
 
-    video_format_Clean( &fmt->video );
-    free(fmt->subs.psz_encoding);
+    switch (fmt->i_cat)
+    {
+        case VIDEO_ES:
+            video_format_Clean(&fmt->video);
+            break;
+        case SPU_ES:
+            free(fmt->subs.psz_encoding);
+            break;
+    }
 
     if (fmt->subs.p_style != NULL)
         text_style_Delete(fmt->subs.p_style);
-- 
2.9.3



More information about the vlc-devel mailing list