00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00027 #include "avcodec.h"
00028 #include "ass.h"
00029 #include "libavutil/avstring.h"
00030 #include "libavutil/bprint.h"
00031
00032 static int rt_event_to_ass(AVBPrint *buf, const char *p)
00033 {
00034 int prev_chr_is_space = 1;
00035
00036 while (*p) {
00037 if (*p != '<') {
00038 if (!isspace(*p))
00039 av_bprint_chars(buf, *p, 1);
00040 else if (!prev_chr_is_space)
00041 av_bprint_chars(buf, ' ', 1);
00042 prev_chr_is_space = isspace(*p);
00043 } else {
00044 const char *end = strchr(p, '>');
00045 if (!end)
00046 break;
00047 if (!av_strncasecmp(p, "<br/>", 5) ||
00048 !av_strncasecmp(p, "<br>", 4)) {
00049 av_bprintf(buf, "\\N");
00050 }
00051 p = end;
00052 }
00053 p++;
00054 }
00055 av_bprintf(buf, "\r\n");
00056 return 0;
00057 }
00058
00059 static int realtext_decode_frame(AVCodecContext *avctx,
00060 void *data, int *got_sub_ptr, AVPacket *avpkt)
00061 {
00062 AVSubtitle *sub = data;
00063 const char *ptr = avpkt->data;
00064 AVBPrint buf;
00065
00066 av_bprint_init(&buf, 0, 4096);
00067
00068
00069 if (ptr && avpkt->size > 0 && !rt_event_to_ass(&buf, ptr))
00070 ff_ass_add_rect(sub, buf.str, avpkt->pts, avpkt->duration, 0);
00071 *got_sub_ptr = sub->num_rects > 0;
00072 av_bprint_finalize(&buf, NULL);
00073 return avpkt->size;
00074 }
00075
00076 AVCodec ff_realtext_decoder = {
00077 .name = "realtext",
00078 .long_name = NULL_IF_CONFIG_SMALL("RealText subtitle"),
00079 .type = AVMEDIA_TYPE_SUBTITLE,
00080 .id = AV_CODEC_ID_REALTEXT,
00081 .decode = realtext_decode_frame,
00082 .init = ff_ass_subtitle_header_default,
00083 };