[FFmpeg-devel] [PATCH]Addedd Kate demuxer and decoder
Clément Bœsch
u at pkh.me
Tue Oct 21 23:14:43 CEST 2014
On Tue, Oct 21, 2014 at 10:02:35PM +0530, Hima Dangi wrote:
> diff --git a/libavformat/Makefile b/libavformat/Makefile
> index 86064ea..4d41283 100644
> --- a/libavformat/Makefile
> +++ b/libavformat/Makefile
A git format-patch is prefered because it includes authorship, commit
message, commit description, ...
> @@ -433,6 +433,7 @@ OBJS-$(CONFIG_VOBSUB_DEMUXER) += subtitles.o
> # mpeg demuxer is in the
> OBJS-$(CONFIG_VOC_DEMUXER) += vocdec.o voc.o
> OBJS-$(CONFIG_VOC_MUXER) += vocenc.o voc.o
> OBJS-$(CONFIG_VPLAYER_DEMUXER) += vplayerdec.o subtitles.o
> +OBJS-$(CONFIG_KATE_DEMUXER) += katedec.o subtitles.o
> OBJS-$(CONFIG_VQF_DEMUXER) += vqf.o
This is not the correct order
> OBJS-$(CONFIG_W64_DEMUXER) += wavdec.o w64.o pcm.o
> OBJS-$(CONFIG_W64_MUXER) += wavenc.o w64.o
> diff --git a/libavformat/allformats.c b/libavformat/allformats.c
> index d54ed9b..6e16031 100644
> --- a/libavformat/allformats.c
> +++ b/libavformat/allformats.c
> @@ -320,7 +320,7 @@ void av_register_all(void)
> REGISTER_DEMUXER (XWMA, xwma);
> REGISTER_DEMUXER (YOP, yop);
> REGISTER_MUXDEMUX(YUV4MPEGPIPE, yuv4mpegpipe);
> -
> + REGISTER_DEMUXER (KATE, kate);
kate should be along its subtitles peers
> /* image demuxers */
> REGISTER_DEMUXER (IMAGE_BMP_PIPE, image_bmp_pipe);
> REGISTER_DEMUXER (IMAGE_DPX_PIPE, image_dpx_pipe);
> diff --git a/libavformat/katedec.c b/libavformat/katedec.c
> new file mode 100644
> index 0000000..7b4ced3
> --- /dev/null
> +++ b/libavformat/katedec.c
> @@ -0,0 +1,158 @@
First, before I start. All the indentation in the file is completely
broken. See the other code source files for a reference, and
http://ffmpeg.org/developer.html#Coding-Rules-1
> +
> +
> +/**
> + * @file
> + * Kate subtitles format demuxer
> + */
> +
> +#include "avformat.h"
> +#include "internal.h"
> +#include "subtitles.h"
> +#include "libavutil/bprint.h"
> +#include "libavutil/intreadwrite.h"
> +
> +
> +typedef struct {
> + FFDemuxSubtitlesQueue q;
> +} KateContext;
> +
> +static int kate_probe(AVProbeData *p)
> +{
> + int v1,v2,v3,v4,v5,v6;
> + const char *ptr = p->buf;
> + const char *find;
> + if(strstr(ptr,"kate {"))
> + {
> +
> + find=strstr(ptr,"event {");
What happens if you have "event" and the timestamp just after?
> + while(strcmp(find,"\n")==0 || strcmp(find," ")==0)
This can not work, it was not tested.
Also, you can use a simple equality since it's only single characters.
> + find++;
> + if ( sscanf(find," %2d:%2d:%2d -->
> %2d:%2d:%2d",&v1,&v2,&v3,&v4,&v5,&v6 )>=4)
Why >= 4?
Also, your mail is mangled (lines are wrapped), you didn't send it
properly. Use git-send-email or configure your mailer.
> + return AVPROBE_SCORE_MAX;
> + else
> + return 0;
> + }
> + else
> + return 0;
> +}
> +
> +static int64_t get_pts_start(const char **buf)
> +{
> +
> + int hh1, mm1, ss1;
> + int hh2, mm2, ss2;
> + const char *find = strstr(*buf,"event");
> + while(strcmp(find,"\n")|| strcmp(find," "))
> + find++;
> + if(sscanf(find, "%2d:%2d:%2d --> %2d:%2d:%2d",&hh1, &mm1,
> &ss1,&hh2, &mm2, &ss2)>=6)
> + {
> + int64_t start = (hh1*3600LL + mm1*60LL + ss1) * 1000LL;
> + *buf += ff_subtitles_next_line(*buf);
> + return start;
> + }
> + *buf += ff_subtitles_next_line(*buf);
> + return AV_NOPTS_VALUE;
> +}
> +
> +static int64_t get_pts_end(const char **buf)
> +{
This function is almost identical to get_pts_start(), they should be
refactored.
> +
> + int hh1, mm1, ss1;
> + int hh2, mm2, ss2;
> + const char *find = strstr(*buf,"event");
> + while(strcmp(find,"\n") || strcmp(find," "))
> + find++;
> + if(sscanf(find, "%2d:%2d:%2d --> %2d:%2d:%2d",&hh1, &mm1,
> &ss1,&hh2, &mm2, &ss2)>=6)
> + {
> + int64_t end = (hh2*3600LL + mm2*60LL + ss2) * 1000LL;
>
> + *buf += ff_subtitles_next_line(*buf);
> + return end;
> + }
> + *buf += ff_subtitles_next_line(*buf);
> + return AV_NOPTS_VALUE;
> +}
> +
> +static int kate_read_header(AVFormatContext *s)
> +{
> + KateContext *kate = s->priv_data;
> + AVStream *st = avformat_new_stream(s, NULL);
> + int64_t pts_start;
> + int64_t pts_end;
> + int64_t duration;
> + if (!st)
> + return AVERROR(ENOMEM);
> + avpriv_set_pts_info(st, 64, 1, 100);
> + st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
> + st->codec->codec_id = AV_CODEC_ID_TEXT;
> +
> +
> +
> + while (!avio_feof(s->pb))
> + {
> + char line[4096];
> + const char *p = line;
> + const int64_t pos = avio_tell(s->pb);
> + int len = ff_get_line(s->pb, line, sizeof(line));
> +
Since you're reading line per line, how can this work with multiline
events.
And typically, I'd be surprised if your code works with this:
kate {
event
{
01:02:03 --> 04:05:06
"foo bar"
}
}
> + AVPacket *sub;
> +
> +
> +
No need to add so much spacing
[...]
--
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 473 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20141021/481f7b23/attachment.asc>
More information about the ffmpeg-devel
mailing list