mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-04-14 00:58:38 +02:00
lavf/mpegts: Convert service_name and service_provider to utf-8.
Fixes ticket #6320.
This commit is contained in:
parent
5b32f94b97
commit
5c515b5f7d
@ -37,6 +37,9 @@
|
|||||||
#include "avio_internal.h"
|
#include "avio_internal.h"
|
||||||
#include "mpeg.h"
|
#include "mpeg.h"
|
||||||
#include "isom.h"
|
#include "isom.h"
|
||||||
|
#if CONFIG_ICONV
|
||||||
|
#include <iconv.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/* maximum size in which we look for synchronization if
|
/* maximum size in which we look for synchronization if
|
||||||
* synchronization is lost */
|
* synchronization is lost */
|
||||||
@ -674,6 +677,47 @@ static char *getstr8(const uint8_t **pp, const uint8_t *p_end)
|
|||||||
return NULL;
|
return NULL;
|
||||||
if (len > p_end - p)
|
if (len > p_end - p)
|
||||||
return NULL;
|
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);
|
str = av_malloc(len + 1);
|
||||||
if (!str)
|
if (!str)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
// Also please add any ticket numbers that you believe might be affected here
|
// Also please add any ticket numbers that you believe might be affected here
|
||||||
#define LIBAVFORMAT_VERSION_MAJOR 58
|
#define LIBAVFORMAT_VERSION_MAJOR 58
|
||||||
#define LIBAVFORMAT_VERSION_MINOR 26
|
#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, \
|
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||||
LIBAVFORMAT_VERSION_MINOR, \
|
LIBAVFORMAT_VERSION_MINOR, \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user