[FFmpeg-devel] [PATCH]lavf/mpegts: Convert service name and service provider to utf-8
Marton Balint
cus at passwd.hu
Sat Feb 9 00:09:34 EET 2019
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 <ceffmpeg at 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
More information about the ffmpeg-devel
mailing list