Mercurial > libavformat.hg
changeset 1462:e5e2d80a859c libavformat
utf8 title support for psp (untested)
author | michael |
---|---|
date | Wed, 08 Nov 2006 01:15:06 +0000 |
parents | 23f88db38eb5 |
children | acf4dbb1a7e6 |
files | movenc.c |
diffstat | 1 files changed, 30 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/movenc.c Wed Nov 08 00:02:15 2006 +0000 +++ b/movenc.c Wed Nov 08 01:15:06 2006 +0000 @@ -1225,19 +1225,25 @@ return updateSize(pb, pos); } +static int utf8len(uint8_t *b){ + int len=0; + int val; + while(*b){ + GET_UTF8(val, *b++, return -1;) + len++; + } + return len; +} -static size_t ascii_to_wc (ByteIOContext *pb, char *b, size_t n) +static int ascii_to_wc (ByteIOContext *pb, uint8_t *b) { - size_t i; - unsigned char c; - for (i = 0; i < n - 1; i++) { - c = b[i]; - if (! (0x20 <= c && c <= 0x7f )) - c = 0x3f; /* '?' */ - put_be16(pb, c); + int val; + while(*b){ + GET_UTF8(val, *b++, return -1;) + put_be16(pb, val); } put_be16(pb, 0x00); - return 2*n; + return 0; } static uint16_t language_code (const char *str) @@ -1275,31 +1281,37 @@ size += 12; // Encoder - len = strlen(LIBAVCODEC_IDENT)+1; + len = utf8len(LIBAVCODEC_IDENT)+1; + if(len<=0) + goto not_utf8; put_be16(pb, len*2+10); /* size */ put_be32(pb, 0x04); /* type */ put_be16(pb, language_code("eng")); /* language */ put_be16(pb, 0x01); /* ? */ - ascii_to_wc(pb, LIBAVCODEC_IDENT, len); + ascii_to_wc(pb, LIBAVCODEC_IDENT); size += len*2+10; // Title - len = strlen(s->title)+1; + len = utf8len(s->title)+1; + if(len<=0) + goto not_utf8; put_be16(pb, len*2+10); /* size */ put_be32(pb, 0x01); /* type */ put_be16(pb, language_code("eng")); /* language */ put_be16(pb, 0x01); /* ? */ - ascii_to_wc (pb, s->title, len); + ascii_to_wc (pb, s->title); size += len*2+10; // Date // snprintf(dt,32,"%04d/%02d/%02d %02d:%02d:%02d",t_st->tm_year+1900,t_st->tm_mon+1,t_st->tm_mday,t_st->tm_hour,t_st->tm_min,t_st->tm_sec); - len = strlen("2006/04/01 11:11:11")+1; + len = utf8len("2006/04/01 11:11:11")+1; + if(len<=0) + goto not_utf8; put_be16(pb, len*2+10); /* size */ put_be32(pb, 0x03); /* type */ put_be16(pb, language_code("und")); /* language */ put_be16(pb, 0x01); /* ? */ - ascii_to_wc (pb, "2006/04/01 11:11:11", len); + ascii_to_wc (pb, "2006/04/01 11:11:11"); size += len*2+10; // size @@ -1312,6 +1324,9 @@ } return size; +not_utf8: + av_log(s, AV_LOG_ERROR, "not utf8\n"); + return -1; } static int mov_write_moov_tag(ByteIOContext *pb, MOVContext *mov,