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/bprint.h"
00030
00031 static int subviewer_event_to_ass(AVBPrint *buf, const char *p)
00032 {
00033 while (*p) {
00034 char c;
00035
00036 if (sscanf(p, "%*u:%*u:%*u.%*u,%*u:%*u:%*u.%*u%c", &c) == 1)
00037 p += strcspn(p, "\n") + 1;
00038 if (!strncmp(p, "[br]", 4)) {
00039 av_bprintf(buf, "\\N");
00040 p += 4;
00041 } else {
00042 if (p[0] == '\n' && p[1])
00043 av_bprintf(buf, "\\N");
00044 else if (*p != '\r')
00045 av_bprint_chars(buf, *p, 1);
00046 p++;
00047 }
00048 }
00049
00050 av_bprintf(buf, "\r\n");
00051 return 0;
00052 }
00053
00054 static int subviewer_decode_frame(AVCodecContext *avctx,
00055 void *data, int *got_sub_ptr, AVPacket *avpkt)
00056 {
00057 AVSubtitle *sub = data;
00058 const char *ptr = avpkt->data;
00059 AVBPrint buf;
00060
00061 av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED);
00062
00063
00064 if (ptr && avpkt->size > 0 && !subviewer_event_to_ass(&buf, ptr))
00065 ff_ass_add_rect(sub, buf.str, avpkt->pts, avpkt->duration, 0);
00066 *got_sub_ptr = sub->num_rects > 0;
00067 av_bprint_finalize(&buf, NULL);
00068 return avpkt->size;
00069 }
00070
00071 AVCodec ff_subviewer_decoder = {
00072 .name = "subviewer",
00073 .long_name = NULL_IF_CONFIG_SMALL("SubViewer subtitle"),
00074 .type = AVMEDIA_TYPE_SUBTITLE,
00075 .id = AV_CODEC_ID_SUBVIEWER,
00076 .decode = subviewer_decode_frame,
00077 .init = ff_ass_subtitle_header_default,
00078 };