lavf/mpegts: Convert service_name and service_provider to utf-8.

Fixes ticket #6320.
This commit is contained in:
Carl Eugen Hoyos 2019-02-09 18:38:13 +01:00
parent 5b32f94b97
commit 5c515b5f7d
2 changed files with 45 additions and 1 deletions

View File

@ -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,47 @@ 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", "UCS-2BE", "UTF-8", "", "",
"", "", "", "", "", "", "", ""
};
iconv_t cd;
char *in, *out;
size_t inlen = len - 1, outlen = inlen * 6 + 1;
if (len >= 3 && p[0] == 0x10 && !p[1] && p[2] && p[2] <= 0xf && p[2] != 0xc) {
char iso8859[12];
snprintf(iso8859, sizeof(iso8859), "ISO-8859-%d", p[2]);
inlen -= 2;
in = (char *)p + 3;
cd = iconv_open("UTF-8", iso8859);
} else {
in = (char *)p + 1;
cd = iconv_open("UTF-8", encodings[*p]);
}
if (cd == (iconv_t)-1)
goto no_iconv;
str = out = av_malloc(outlen);
if (!str) {
iconv_close(cd);
return NULL;
}
if (iconv(cd, &in, &inlen, &out, &outlen) == -1) {
iconv_close(cd);
av_freep(&str);
goto no_iconv;
}
iconv_close(cd);
*out = 0;
*pp = p + len;
return str;
}
no_iconv:
#endif
str = av_malloc(len + 1);
if (!str)
return NULL;

View File

@ -33,7 +33,7 @@
// Also please add any ticket numbers that you believe might be affected here
#define LIBAVFORMAT_VERSION_MAJOR 58
#define LIBAVFORMAT_VERSION_MINOR 26
#define LIBAVFORMAT_VERSION_MICRO 100
#define LIBAVFORMAT_VERSION_MICRO 101
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \