[vlc-commits] STL: retrieve fps from GSI's DFC

Stefan Pöschel git at videolan.org
Fri Nov 10 09:25:23 CET 2017


vlc | branch: master | Stefan Pöschel <github at basicmaster.de> | Wed Nov  8 22:28:56 2017 +0100| [4dedfb2a32082c99d550c7f155239e35ca888566] | committer: Jean-Baptiste Kempf

STL: retrieve fps from GSI's DFC

Replaces the hard-coded 30fps.

Close #19054

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4dedfb2a32082c99d550c7f155239e35ca888566
---

 modules/codec/stl.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/modules/codec/stl.c b/modules/codec/stl.c
index 2ee88bab2e..9c6ddc9663 100644
--- a/modules/codec/stl.c
+++ b/modules/codec/stl.c
@@ -103,6 +103,7 @@ typedef struct {
 struct decoder_sys_t {
     stl_sg_t groups[STL_GROUPS_MAX + 1];
     cct_number_value_t cct;
+    uint8_t i_fps;
 };
 
 static cct_number_t cct_nums[] = { {CCT_ISO_6937_2, "ISO_6937-2"},
@@ -265,7 +266,7 @@ static void ClearTeletextStyles(stl_sg_t *p_group)
 }
 
 /* Returns true if group is we need to output group */
-static bool ParseTTI(stl_sg_t *p_group, const uint8_t *p_data, const char *psz_charset)
+static bool ParseTTI(stl_sg_t *p_group, const uint8_t *p_data, const char *psz_charset, double fps)
 {
     uint8_t p_buffer[STL_TEXTFIELD_SIZE];
     uint8_t i_buffer = 0;
@@ -285,8 +286,8 @@ static bool ParseTTI(stl_sg_t *p_group, const uint8_t *p_data, const char *psz_c
      * We must not flush current segments on output and continue on next block */
     p_group->i_accumulating = (p_data[4] == 0x01 || p_data[4] == 0x02);
 
-    p_group->i_start = ParseTimeCode( &p_data[5], 30 );
-    p_group->i_end = ParseTimeCode( &p_data[9], 30 );
+    p_group->i_start = ParseTimeCode( &p_data[5], fps );
+    p_group->i_end = ParseTimeCode( &p_data[9], fps );
 
     /* Text Field */
     for (size_t i = STL_TTI_HEADER_SIZE; i < STL_TTI_SIZE; i++)
@@ -399,7 +400,7 @@ static int Decode(decoder_t *p_dec, block_t *p_block)
     for (size_t i = 0; i < p_block->i_buffer / STL_TTI_SIZE; i++)
     {
         stl_sg_t *p_group = &p_dec->p_sys->groups[p_block->p_buffer[0]];
-        if(ParseTTI(p_group, &p_block->p_buffer[i * STL_TTI_SIZE], psz_charset) &&
+        if(ParseTTI(p_group, &p_block->p_buffer[i * STL_TTI_SIZE], psz_charset, p_dec->p_sys->i_fps) &&
            p_group->p_segment != NULL )
         {
             /* output */
@@ -445,12 +446,21 @@ static int ParseGSI(const decoder_t *dec, decoder_sys_t *p_sys)
         return VLC_EGENERIC;
     }
 
+    char dfc_fps_str[] = { header[6], header[7], '\0' };
+    int fps = strtol(dfc_fps_str, NULL, 10);
+    if (1 > fps || 60 < fps) {
+        msg_Warn(dec, "EBU header contains unsupported DFC fps ('%s'); falling back to 25\n", dfc_fps_str);
+        fps = 25;
+    }
+
     int cct = (header[12] << 8) | header[13];
     if (CCT_BEGIN > cct || CCT_END < cct) {
         msg_Err(dec, "EBU header contains illegal CCT (0x%x)\n", cct);
         return VLC_EGENERIC;
     }
-    msg_Dbg(dec, "CCT=0x%x", cct);
+
+    msg_Dbg(dec, "DFC fps=%d, CCT=0x%x", fps, cct);
+    p_sys->i_fps = fps;
     p_sys->cct = cct;
 
     return VLC_SUCCESS;



More information about the vlc-commits mailing list