[FFmpeg-devel] [PATCH 3/4] avformat/samidec: UTF-16 support
wm4
nfxjfg at googlemail.com
Wed Sep 3 00:43:02 CEST 2014
On Wed, 3 Sep 2014 00:03:04 +0200
Clément Bœsch <u at pkh.me> wrote:
> On Tue, Sep 02, 2014 at 08:56:11PM +0200, wm4 wrote:
> > ff_smil_extract_next_chunk() is still used by RealText.
> > ---
> > libavformat/samidec.c | 17 ++++++++++-------
> > libavformat/subtitles.c | 15 ++++++++++++---
> > libavformat/subtitles.h | 5 +++++
> > 3 files changed, 27 insertions(+), 10 deletions(-)
> >
> > diff --git a/libavformat/samidec.c b/libavformat/samidec.c
> > index 1a12eca..4dbf2cf 100644
> > --- a/libavformat/samidec.c
> > +++ b/libavformat/samidec.c
> > @@ -38,11 +38,12 @@ typedef struct {
> >
> > static int sami_probe(AVProbeData *p)
> > {
> > - const unsigned char *ptr = p->buf;
> > + char buf[6];
> > + FFTextReader tr;
> > + ff_text_init_buf(&tr, p->buf, p->buf_size);
> > + ff_text_read(&tr, buf, sizeof(buf));
> >
> > - if (AV_RB24(ptr) == 0xEFBBBF)
> > - ptr += 3; /* skip UTF-8 BOM */
> > - return !strncmp(ptr, "<SAMI>", 6) ? AVPROBE_SCORE_MAX : 0;
> > + return !strncmp(buf, "<SAMI>", 6) ? AVPROBE_SCORE_MAX : 0;
> > }
> >
> > static int sami_read_header(AVFormatContext *s)
> > @@ -52,6 +53,8 @@ static int sami_read_header(AVFormatContext *s)
> > AVBPrint buf, hdr_buf;
> > char c = 0;
> > int res = 0, got_first_sync_point = 0;
> > + FFTextReader tr;
> > + ff_text_init_avio(&tr, s->pb);
> >
> > if (!st)
> > return AVERROR(ENOMEM);
> > @@ -62,10 +65,10 @@ static int sami_read_header(AVFormatContext *s)
> > av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED);
> > av_bprint_init(&hdr_buf, 0, AV_BPRINT_SIZE_UNLIMITED);
> >
> > - while (!avio_feof(s->pb)) {
> > + while (!ff_text_eof(&tr)) {
> > AVPacket *sub;
> > - const int64_t pos = avio_tell(s->pb) - (c != 0);
> > - int is_sync, n = ff_smil_extract_next_chunk(s->pb, &buf, &c);
> > + const int64_t pos = ff_text_pos(&tr) - (c != 0);
> > + int is_sync, n = ff_smil_extract_next_text_chunk(&tr, &buf, &c);
> >
> > if (n == 0)
> > break;
> > diff --git a/libavformat/subtitles.c b/libavformat/subtitles.c
> > index 1641aae..b8b680e 100644
> > --- a/libavformat/subtitles.c
> > +++ b/libavformat/subtitles.c
> > @@ -272,20 +272,20 @@ void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q)
> > q->nb_subs = q->allocated_size = q->current_sub_idx = 0;
> > }
> >
> > -int ff_smil_extract_next_chunk(AVIOContext *pb, AVBPrint *buf, char *c)
> > +int ff_smil_extract_next_text_chunk(FFTextReader *tr, AVBPrint *buf, char *c)
> > {
> > int i = 0;
> > char end_chr;
> >
> > if (!*c) // cached char?
> > - *c = avio_r8(pb);
> > + *c = ff_text_r8(tr);
> > if (!*c)
> > return 0;
> >
> > end_chr = *c == '<' ? '>' : '<';
> > do {
> > av_bprint_chars(buf, *c, 1);
> > - *c = avio_r8(pb);
> > + *c = ff_text_r8(tr);
> > i++;
> > } while (*c != end_chr && *c);
> > if (end_chr == '>') {
> > @@ -295,6 +295,15 @@ int ff_smil_extract_next_chunk(AVIOContext *pb, AVBPrint *buf, char *c)
> > return i;
> > }
> >
>
> > +int ff_smil_extract_next_chunk(AVIOContext *pb, AVBPrint *buf, char *c)
> > +{
> > + FFTextReader tr;
> > + tr.buf_pos = tr.buf_len = 0;
> > + tr.type = 0;
> > + tr.pb = pb;
> > + return ff_smil_extract_next_text_chunk(&tr, buf, c);
>
> How can this work with utf-16? Aren't you supposed to use the type
> obtained after the ff_text_init_avio() in sami_read_header() or something
> along those lines?
This is just for "compatibility" with RealText, and is actually removed
with the next patch (only reason why I did RealText). Sami in this
patch uses the "new" function.
More information about the ffmpeg-devel
mailing list