[FFmpeg-devel] [PATCH] lavf: add libquvi demuxer.
Nicolas George
nicolas.george at normalesup.org
Thu Apr 4 12:44:42 CEST 2013
Le quintidi 15 germinal, an CCXXI, Clement Boesch a écrit :
> From ae193b28011e6354b57c0c3c47af00c53c07a6a5 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Cl=C3=A9ment=20B=C5=93sch?= <ubitux at gmail.com>
> Date: Thu, 4 Apr 2013 08:22:32 +0200
> Subject: [PATCH] lavf: add libquvi demuxer.
>
> ---
> Changelog | 1 +
> configure | 4 ++
> libavformat/Makefile | 1 +
> libavformat/allformats.c | 1 +
> libavformat/libquvi.c | 145 +++++++++++++++++++++++++++++++++++++++++++++++
> libavformat/version.h | 2 +-
> 6 files changed, 153 insertions(+), 1 deletion(-)
> create mode 100644 libavformat/libquvi.c
No documentation?
>
> diff --git a/Changelog b/Changelog
> index 5faa414..1ee0d4a 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -16,6 +16,7 @@ version <next>:
> filtergraph description to be read from a file
> - OpenCL support
> - audio phaser filter
> +- libquvi demuxer
>
>
> version 1.2:
> diff --git a/configure b/configure
> index 4b46007..c36c09d 100755
> --- a/configure
> +++ b/configure
> @@ -215,6 +215,7 @@ External library support:
> --enable-libopenjpeg enable JPEG 2000 de/encoding via OpenJPEG [no]
> --enable-libopus enable Opus decoding via libopus [no]
> --enable-libpulse enable Pulseaudio input via libpulse [no]
> + --enable-libquvi enable quvi input via libquvi [no]
> --enable-librtmp enable RTMP[E] support via librtmp [no]
> --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
> --enable-libsoxr enable Include libsoxr resampling [no]
> @@ -1163,6 +1164,7 @@ EXTERNAL_LIBRARY_LIST="
> libopenjpeg
> libopus
> libpulse
> + libquvi
> librtmp
> libschroedinger
> libsoxr
> @@ -1954,6 +1956,7 @@ libopenjpeg_encoder_deps="libopenjpeg"
> libopus_decoder_deps="libopus"
> libopus_encoder_deps="libopus"
> libopus_encoder_select="audio_frame_queue"
> +libquvi_demuxer_deps="libquvi"
> libschroedinger_decoder_deps="libschroedinger"
> libschroedinger_encoder_deps="libschroedinger"
> libspeex_decoder_deps="libspeex"
> @@ -3970,6 +3973,7 @@ enabled libopenjpeg && { check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpe
> die "ERROR: libopenjpeg not found"; }
> enabled libopus && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
> enabled libpulse && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new
> +enabled libquvi && require_pkg_config libquvi quvi/quvi.h quvi_init
> enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
> enabled libschroedinger && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
> enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr
> diff --git a/libavformat/Makefile b/libavformat/Makefile
> index bc6ea16..470e7f3 100644
> --- a/libavformat/Makefile
> +++ b/libavformat/Makefile
> @@ -405,6 +405,7 @@ OBJS-$(CONFIG_YUV4MPEGPIPE_DEMUXER) += yuv4mpeg.o
> OBJS-$(CONFIG_LIBMODPLUG_DEMUXER) += libmodplug.o
> OBJS-$(CONFIG_LIBNUT_DEMUXER) += libnut.o
> OBJS-$(CONFIG_LIBNUT_MUXER) += libnut.o
> +OBJS-$(CONFIG_LIBQUVI_DEMUXER) += libquvi.o
> OBJS-$(CONFIG_LIBRTMP) += librtmp.o
>
> # protocols I/O
> diff --git a/libavformat/allformats.c b/libavformat/allformats.c
> index 8c746ff..8663f81 100644
> --- a/libavformat/allformats.c
> +++ b/libavformat/allformats.c
> @@ -338,4 +338,5 @@ void av_register_all(void)
> REGISTER_PROTOCOL(LIBRTMPS, librtmps);
> REGISTER_PROTOCOL(LIBRTMPT, librtmpt);
> REGISTER_PROTOCOL(LIBRTMPTE, librtmpte);
> + REGISTER_DEMUXER (LIBQUVI, libquvi);
> }
> diff --git a/libavformat/libquvi.c b/libavformat/libquvi.c
> new file mode 100644
> index 0000000..992ebe7
> --- /dev/null
> +++ b/libavformat/libquvi.c
> @@ -0,0 +1,145 @@
> +/*
> + * Copyright (c) 2013 Clément Bœsch
> + *
> + * 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 <quvi/quvi.h>
> +
> +#include "libavformat/avformat.h"
> +#include "libavformat/internal.h"
> +#include "libavutil/opt.h"
> +
> +typedef struct {
> + const AVClass *class;
> + char *format;
> + AVFormatContext *fmtctx;
> +} LibQuviContext;
> +
> +#define OFFSET(x) offsetof(LibQuviContext, x)
> +#define FLAGS AV_OPT_FLAG_DECODING_PARAM
> +static const AVOption libquvi_options[] = {
> + { "format", "request specific format", OFFSET(format), AV_OPT_TYPE_STRING, {.str="best"}, .flags = FLAGS },
> + { NULL }
> +};
> +
> +static const AVClass libquvi_context_class = {
> + .class_name = "libquvi",
> + .item_name = av_default_item_name,
> + .option = libquvi_options,
> + .version = LIBAVUTIL_VERSION_INT,
> +};
> +
> +static int libquvi_close(AVFormatContext *s)
> +{
> + LibQuviContext *qc = s->priv_data;
> + if (qc->fmtctx)
> + avformat_close_input(&qc->fmtctx);
> + return 0;
> +}
> +
> +static int libquvi_read_header(AVFormatContext *s)
> +{
> + int i, ret;
> + quvi_t q;
> + quvi_media_t m;
> + QUVIcode rc;
> + LibQuviContext *qc = s->priv_data;
> + char *media_url, *pagetitle;
> +
> + rc = quvi_init(&q);
> + if (rc != QUVI_OK)
> + goto quvi_fail;
> +
> + quvi_setopt(q, QUVIOPT_FORMAT, qc->format);
> +
> + rc = quvi_parse(q, s->filename, &m);
> + if (rc != QUVI_OK)
> + goto quvi_fail;
> +
> + rc = quvi_getprop(m, QUVIPROP_MEDIAURL, &media_url);
> + if (rc != QUVI_OK)
> + goto quvi_fail;
> +
> + ret = avformat_open_input(&qc->fmtctx, media_url, NULL, NULL);
Some services, including youtube depending on the phase of the moon, use the
user-agent / the referrer / cookies to perform filtering. Will they work?
> + if (ret < 0)
> + goto end;
> +
> + rc = quvi_getprop(m, QUVIPROP_PAGETITLE, &pagetitle);
> + if (rc == QUVI_OK)
> + av_dict_set(&s->metadata, "title", pagetitle, 0);
> +
> + for (i = 0; i < qc->fmtctx->nb_streams; i++) {
> + AVStream *st = avformat_new_stream(s, NULL);
> + AVStream *ist = qc->fmtctx->streams[i];
> + if (!st) {
> + ret = AVERROR(ENOMEM);
> + goto end;
> + }
> + avpriv_set_pts_info(st, ist->pts_wrap_bits, ist->time_base.num, ist->time_base.den);
> + avcodec_copy_context(st->codec, qc->fmtctx->streams[i]->codec);
> + }
> +
> + return 0;
> +
> +quvi_fail:
> + av_log(s, AV_LOG_ERROR, "%s\n", quvi_strerror(&q, rc));
> + ret = rc;
> +
> +end:
> + quvi_parse_close(&m);
> + quvi_close(&q);
> + return ret;
> +}
> +
> +static int libquvi_read_packet(AVFormatContext *s, AVPacket *pkt)
> +{
> + LibQuviContext *qc = s->priv_data;
> + return av_read_frame(qc->fmtctx, pkt);
> +}
> +
> +static int libquvi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
> +{
> + LibQuviContext *qc = s->priv_data;
> + return av_seek_frame(qc->fmtctx, stream_index, timestamp, flags);
> +}
> +
> +static int libquvi_probe(AVProbeData *p)
> +{
> + int score;
> + quvi_t q;
> + QUVIcode rc;
> +
> + rc = quvi_init(&q);
> + if (rc != QUVI_OK)
> + return AVERROR(ENOMEM);
> + score = quvi_supported(q, (char *)p->filename) == QUVI_OK ? AVPROBE_SCORE_MAX/2 : 0;
> + quvi_close(&q);
> + return score;
> +}
> +
> +AVInputFormat ff_libquvi_demuxer = {
> + .name = "libquvi",
> + .long_name = NULL_IF_CONFIG_SMALL("libquvi demuxer"),
> + .priv_data_size = sizeof(LibQuviContext),
> + .read_probe = libquvi_probe,
> + .read_header = libquvi_read_header,
> + .read_packet = libquvi_read_packet,
> + .read_close = libquvi_close,
> + .read_seek = libquvi_read_seek,
> + .priv_class = &libquvi_context_class,
AVFMT_NOFILE?
> +};
> diff --git a/libavformat/version.h b/libavformat/version.h
> index 17447c0..8f9139a 100644
> --- a/libavformat/version.h
> +++ b/libavformat/version.h
> @@ -30,7 +30,7 @@
> #include "libavutil/avutil.h"
>
> #define LIBAVFORMAT_VERSION_MAJOR 55
> -#define LIBAVFORMAT_VERSION_MINOR 1
> +#define LIBAVFORMAT_VERSION_MINOR 2
> #define LIBAVFORMAT_VERSION_MICRO 100
>
> #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
Regards,
--
Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130404/5d3f1686/attachment.asc>
More information about the ffmpeg-devel
mailing list