[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