diff --git a/libavcodec/dvbtxt.h b/libavcodec/dvbtxt.h new file mode 100644 index 0000000000..ff88fcf0b2 --- /dev/null +++ b/libavcodec/dvbtxt.h @@ -0,0 +1,41 @@ +/* + * DVB teletext common functions. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_DVBTXT_H +#define AVCODEC_DVBTXT_H + +#include "libavutil/attributes.h" + +/* Returns true if data identifier matches a teletext stream according to EN + * 301 775 section 4.4.2 */ +static av_always_inline int ff_data_identifier_is_teletext(int data_identifier) +{ + return (data_identifier >= 0x10 && data_identifier <= 0x1F || + data_identifier >= 0x99 && data_identifier <= 0x9B); +} + +/* Returns true if data unit id matches EBU teletext data according to + * EN 301 775 section 4.4.2 */ +static av_always_inline int ff_data_unit_id_is_teletext(int data_unit_id) +{ + return (data_unit_id == 0x02 || data_unit_id == 0x03); +} + +#endif /* AVCODEC_DVBTXT_H */ diff --git a/libavformat/Makefile b/libavformat/Makefile index 001b3f114d..aace6f7de7 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -144,6 +144,7 @@ OBJS-$(CONFIG_DTS_MUXER) += rawenc.o OBJS-$(CONFIG_DV_DEMUXER) += dv.o OBJS-$(CONFIG_DV_MUXER) += dvenc.o OBJS-$(CONFIG_DVBSUB_DEMUXER) += dvbsub.o +OBJS-$(CONFIG_DVBTXT_DEMUXER) += dvbtxt.o OBJS-$(CONFIG_DXA_DEMUXER) += dxa.o OBJS-$(CONFIG_EA_CDATA_DEMUXER) += eacdata.o OBJS-$(CONFIG_EA_DEMUXER) += electronicarts.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index 02bb16a71e..9662941139 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -121,6 +121,7 @@ void av_register_all(void) REGISTER_DEMUXER (DTSHD, dtshd); REGISTER_MUXDEMUX(DV, dv); REGISTER_DEMUXER (DVBSUB, dvbsub); + REGISTER_DEMUXER (DVBTXT, dvbtxt); REGISTER_DEMUXER (DXA, dxa); REGISTER_DEMUXER (EA, ea); REGISTER_DEMUXER (EA_CDATA, ea_cdata); diff --git a/libavformat/dvbtxt.c b/libavformat/dvbtxt.c new file mode 100644 index 0000000000..6828738340 --- /dev/null +++ b/libavformat/dvbtxt.c @@ -0,0 +1,50 @@ +/* + * RAW dvb teletext demuxer + * Copyright (c) 2016 Marton Balnt + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavcodec/dvbtxt.h" + +#include "avformat.h" +#include "rawdec.h" + +static int dvbtxt_probe(AVProbeData *p) +{ + const uint8_t *end = p->buf + p->buf_size; + const uint8_t *buf; + + /* The purpose of this is demuxer is to detect DVB teletext streams in + * mpegts, so we reject invalid buffer sizes */ + if ((p->buf_size + 45) % 184 != 0) + return 0; + + if (!ff_data_identifier_is_teletext(p->buf[0])) + return 0; + + for (buf = p->buf + 1; buf < end; buf += 46) { + if (!ff_data_unit_id_is_teletext(buf[0]) && buf[0] != 0xff) + return 0; + if (buf[1] != 0x2c) // data_unit_length + return 0; + } + + return AVPROBE_SCORE_MAX / 2; +} + +FF_DEF_RAWSUB_DEMUXER(dvbtxt, "dvbtxt", dvbtxt_probe, NULL, AV_CODEC_ID_DVB_TELETEXT, 0) diff --git a/libavformat/utils.c b/libavformat/utils.c index 129a49d699..671a0c278d 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -285,6 +285,7 @@ static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, { "ac3", AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO }, { "dts", AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO }, { "dvbsub", AV_CODEC_ID_DVB_SUBTITLE,AVMEDIA_TYPE_SUBTITLE }, + { "dvbtxt", AV_CODEC_ID_DVB_TELETEXT,AVMEDIA_TYPE_SUBTITLE }, { "eac3", AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO }, { "h264", AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO }, { "hevc", AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO }, diff --git a/libavformat/version.h b/libavformat/version.h index a696474ff6..82a8892280 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -30,8 +30,8 @@ #include "libavutil/version.h" #define LIBAVFORMAT_VERSION_MAJOR 57 -#define LIBAVFORMAT_VERSION_MINOR 25 -#define LIBAVFORMAT_VERSION_MICRO 102 +#define LIBAVFORMAT_VERSION_MINOR 26 +#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \