On Fri, 8 Feb 2019, Carl Eugen Hoyos wrote:

Hi!

Attached patch fixes ticket #6320, tested with the sample from ticket #7069.

Please comment, Carl Eugen

From fdcd141a29f336925681193a9cdd3f4eaa5c368e Mon Sep 17 00:00:00 2001
From: Carl Eugen Hoyos <ceffm...@gmail.com>
Date: Fri, 8 Feb 2019 01:35:33 +0100
Subject: [PATCH] lavf/mpegts: Convert service_name and service_provider to
 utf-8.

Fixes ticket #6320.
---
 libavformat/mpegts.c |   33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index b04fd7b..dde610f 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -37,6 +37,9 @@
 #include "avio_internal.h"
 #include "mpeg.h"
 #include "isom.h"
+#if CONFIG_ICONV
+#include <iconv.h>
+#endif

 /* maximum size in which we look for synchronization if
  * synchronization is lost */
@@ -674,6 +677,36 @@ static char *getstr8(const uint8_t **pp, const uint8_t 
*p_end)
         return NULL;
     if (len > p_end - p)
         return NULL;
+#if CONFIG_ICONV
+    if (len && *p < 0x20) {
+        const char *encodings[] = {
+            "ISO6937", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", "ISO-8859-8",
+            "ISO-8859-9", "ISO-8859-10", "ISO-8859-11", "", "ISO-8859-13",
+            "ISO-8859-14", "ISO-8859-15", "", "", "", "",
+            "", "ISO-10646", "KSC_5601", "GB2312", "ISO-10646", "UTF-8", "",
+            "", "", "", "", "", "", "", "", ""
+        };
+        iconv_t cd;
+        char *in, *out;
+        size_t inlen = len - 1, outlen = inlen * 6;
+        cd = iconv_open("UTF-8", encodings[*p]);

Can you add support for the ISO-8859-any case where p[0] == 0x10, p[1] == 0x00
and p[2] == any? I will upload a sample to the trac ticket.

+        if (cd == (iconv_t)-1)
+            goto no_iconv;
+        str =
+        out = av_malloc(outlen);

I prefer a single line equation. Also outlen + 1 would be much more safe because outlen can be 0.

+        if (!str)
+            return NULL;

you are leaking iconv context here.

+        in = (char *)p + 1;
+        if (iconv(cd, &in, &inlen, &out, &outlen) == -1) {
+            iconv_close(cd);
+            goto no_iconv;
+        }

and here

+        *out = 0;
+        *pp = in;

maybe safer to use *pp = p + len, I am not sure iconv always consumes all the 
data.

+        return str;
+    }
+no_iconv:
+#endif
     str = av_malloc(len + 1);
     if (!str)
         return NULL;

Thanks,
Marton
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to