Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 28 Oct 2011 00:53:33 +0000 (02:53 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 28 Oct 2011 01:05:16 +0000 (03:05 +0200)
* qatar/master:
  lavc: remove "legacy" mpegvideo decoder.
  iv8: assemble packets to return complete frames
  pulse: documentation
  pulse: introduce pulseaudio input
  remove the zork pcm seek test

Conflicts:
configure
libavdevice/Makefile
libavdevice/alldevices.c
libavdevice/avdevice.h
libavdevice/pulse.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
doc/indevs.texi
libavdevice/pulse.c
libavformat/iv8.c

diff --combined doc/indevs.texi
@@@ -1,10 -1,10 +1,10 @@@
  @chapter Input Devices
  @c man begin INPUT DEVICES
  
 -Input devices are configured elements in Libav which allow to access
 +Input devices are configured elements in FFmpeg which allow to access
  the data coming from a multimedia device attached to your system.
  
 -When you configure your Libav build, all the supported input devices
 +When you configure your FFmpeg build, all the supported input devices
  are enabled by default. You can list all available ones using the
  configure option "--list-indevs".
  
@@@ -55,87 -55,6 +55,87 @@@ For more information see
  
  BSD video input device.
  
 +@section dshow
 +
 +Windows DirectShow input device.
 +
 +DirectShow support is enabled when FFmpeg is built with mingw-w64.
 +Currently only audio and video devices are supported.
 +
 +Multiple devices may be opened as separate inputs, but they may also be
 +opened on the same input, which should improve synchronism between them.
 +
 +The input name should be in the format:
 +
 +@example
 +@var{TYPE}=@var{NAME}[:@var{TYPE}=@var{NAME}]
 +@end example
 +
 +where @var{TYPE} can be either @var{audio} or @var{video},
 +and @var{NAME} is the device's name.
 +
 +@subsection Options
 +
 +If no options are specified, the device's defaults are used.
 +If the device does not support the requested options, it will
 +fail to open.
 +
 +@table @option
 +
 +@item video_size
 +Set the video size in the captured video.
 +
 +@item framerate
 +Set the framerate in the captured video.
 +
 +@item sample_rate
 +Set the sample rate (in Hz) of the captured audio.
 +
 +@item sample_size
 +Set the sample size (in bits) of the captured audio.
 +
 +@item channels
 +Set the number of channels in the captured audio.
 +
 +@item list_devices
 +If set to @option{true}, print a list of devices and exit.
 +
 +@item list_options
 +If set to @option{true}, print a list of selected device's options
 +and exit.
 +
 +@end table
 +
 +@subsection Examples
 +
 +@itemize
 +
 +@item
 +Print the list of DirectShow supported devices and exit:
 +@example
 +$ ffmpeg -list_devices true -f dshow -i dummy
 +@end example
 +
 +@item
 +Open video device @var{Camera}:
 +@example
 +$ ffmpeg -f dshow -i video="Camera"
 +@end example
 +
 +@item
 +Open video device @var{Camera} and audio device @var{Microphone}:
 +@example
 +$ ffmpeg -f dshow -i video="Camera":audio="Microphone"
 +@end example
 +
 +@item
 +Print the list of supported options in selected device and exit:
 +@example
 +$ ffmpeg -list_options true -f dshow -i video="Camera"
 +@end example
 +
 +@end itemize
 +
  @section dv1394
  
  Linux DV 1394 input device.
@@@ -176,7 -95,7 +176,7 @@@ A JACK input device creates one or mor
  each audio channel, with name @var{client_name}:input_@var{N}, where
  @var{client_name} is the name provided by the application, and @var{N}
  is a number which identifies the channel.
 -Each writable client will send the acquired data to the Libav input
 +Each writable client will send the acquired data to the FFmpeg input
  device.
  
  Once you have created one or more JACK readable clients, you need to
@@@ -214,165 -133,10 +214,165 @@@ $ jack_connect metro:120_bpm ffmpeg:inp
  For more information read:
  @url{http://jackaudio.org/}
  
 +@section lavfi
 +
 +Libavfilter input virtual device.
 +
 +This input device reads data from the open output pads of a libavfilter
 +filtergraph.
 +
 +For each filtergraph open output, the input device will create a
 +corresponding stream which is mapped to the generated output. Currently
 +only video data is supported. The filtergraph is specified through the
 +option @option{graph}.
 +
 +@subsection Options
 +
 +@table @option
 +
 +@item graph
 +Specify the filtergraph to use as input. Each video open output must be
 +labelled by a unique string of the form "out@var{N}", where @var{N} is a
 +number starting from 0 corresponding to the mapped input stream
 +generated by the device.
 +The first unlabelled output is automatically assigned to the "out0"
 +label, but all the others need to be specified explicitely.
 +
 +If not specified defaults to the filename specified for the input
 +device.
 +@end table
 +
 +@subsection Examples
 +
 +@itemize
 +@item
 +Create a color video stream and play it back with @file{ffplay}:
 +@example
 +ffplay -f lavfi -graph "color=pink [out0]" dummy
 +@end example
 +
 +@item
 +As the previous example, but use filename for specifying the graph
 +description, and omit the "out0" label:
 +@example
 +ffplay -f lavfi color=pink
 +@end example
 +
 +@item
 +Create three different video test filtered sources and play them:
 +@example
 +ffplay -f lavfi -graph "testsrc [out0]; testsrc,hflip [out1]; testsrc,negate [out2]" test3
 +@end example
 +
 +@item
 +Read an audio stream from a file using the amovie source and play it
 +back with @file{ffplay}:
 +@example
 +ffplay -f lavfi "amovie=test.wav"
 +@end example
 +
 +@item
 +Read an audio stream and a video stream and play it back with
 +@file{ffplay}:
 +@example
 +ffplay -f lavfi "movie=test.avi[out0];amovie=test.wav[out1]"
 +@end example
 +
 +@end itemize
 +
  @section libdc1394
  
  IIDC1394 input device, based on libdc1394 and libraw1394.
  
 +@section openal
 +
 +The OpenAL input device provides audio capture on all systems with a
 +working OpenAL 1.1 implementation.
 +
 +To enable this input device during configuration, you need OpenAL
 +headers and libraries installed on your system, and need to configure
 +FFmpeg with @code{--enable-openal}.
 +
 +OpenAL headers and libraries should be provided as part of your OpenAL
 +implementation, or as an additional download (an SDK). Depending on your
 +installation you may need to specify additional flags via the
 +@code{--extra-cflags} and @code{--extra-ldflags} for allowing the build
 +system to locate the OpenAL headers and libraries.
 +
 +An incomplete list of OpenAL implementations follows:
 +
 +@table @strong
 +@item Creative
 +The official Windows implementation, providing hardware acceleration
 +with supported devices and software fallback.
 +See @url{http://openal.org/}.
 +@item OpenAL Soft
 +Portable, open source (LGPL) software implementation. Includes
 +backends for the most common sound APIs on the Windows, Linux,
 +Solaris, and BSD operating systems.
 +See @url{http://kcat.strangesoft.net/openal.html}.
 +@item Apple
 +OpenAL is part of Core Audio, the official Mac OS X Audio interface.
 +See @url{http://developer.apple.com/technologies/mac/audio-and-video.html}
 +@end table
 +
 +This device allows to capture from an audio input device handled
 +through OpenAL.
 +
 +You need to specify the name of the device to capture in the provided
 +filename. If the empty string is provided, the device will
 +automatically select the default device. You can get the list of the
 +supported devices by using the option @var{list_devices}.
 +
 +@subsection Options
 +
 +@table @option
 +
 +@item channels
 +Set the number of channels in the captured audio. Only the values
 +@option{1} (monaural) and @option{2} (stereo) are currently supported.
 +Defaults to @option{2}.
 +
 +@item sample_size
 +Set the sample size (in bits) of the captured audio. Only the values
 +@option{8} and @option{16} are currently supported. Defaults to
 +@option{16}.
 +
 +@item sample_rate
 +Set the sample rate (in Hz) of the captured audio.
 +Defaults to @option{44.1k}.
 +
 +@item list_devices
 +If set to @option{true}, print a list of devices and exit.
 +Defaults to @option{false}.
 +
 +@end table
 +
 +@subsection Examples
 +
 +Print the list of OpenAL supported devices and exit:
 +@example
 +$ ffmpeg -list_devices true -f openal -i dummy out.ogg
 +@end example
 +
 +Capture from the OpenAL device @file{DR-BT101 via PulseAudio}:
 +@example
 +$ ffmpeg -f openal -i 'DR-BT101 via PulseAudio' out.ogg
 +@end example
 +
 +Capture from the default device (note the empty string '' as filename):
 +@example
 +$ ffmpeg -f openal -i '' out.ogg
 +@end example
 +
 +Capture from two devices simultaneously, writing to two different files,
 +within the same @file{ffmpeg} command:
 +@example
 +$ ffmpeg -f openal -i 'DR-BT101 via PulseAudio' out1.ogg -f openal -i 'ALSA Default' out2.ogg
 +@end example
 +Note: not all OpenAL implementations support multiple simultaneous capture -
 +try the latest OpenAL Soft if the above does not work.
 +
  @section oss
  
  Open Sound System input device.
@@@ -390,6 -154,89 +390,89 @@@ ffmpeg -f oss -i /dev/dsp /tmp/oss.wa
  For more information about OSS see:
  @url{http://manuals.opensound.com/usersguide/dsp.html}
  
+ @section pulse
+ pulseaudio input device.
+ To enable this input device during configuration you need libpulse-simple
+ installed in your system.
+ The filename to provide to the input device is a source device or the
+ string "default"
+ To list the pulse source devices and their properties you can invoke
+ the command @file{pactl list sources}.
+ @example
+ avconv -f pulse -i default /tmp/pulse.wav
+ @end example
+ @subsection @var{server} AVOption
+ The syntax is:
+ @example
+ -server @var{server name}
+ @end example
+ Connects to a specific server.
+ @subsection @var{name} AVOption
+ The syntax is:
+ @example
+ -name @var{application name}
+ @end example
+ Specify the application name pulse will use when showing active clients,
+ by default it is "libav"
+ @subsection @var{stream_name} AVOption
+ The syntax is:
+ @example
+ -stream_name @var{stream name}
+ @end example
+ Specify the stream name pulse will use when showing active streams,
+ by default it is "record"
+ @subsection @var{sample_rate} AVOption
+ The syntax is:
+ @example
+ -sample_rate @var{samplerate}
+ @end example
+ Specify the samplerate in Hz, by default 48kHz is used.
+ @subsection @var{channels} AVOption
+ The syntax is:
+ @example
+ -channels @var{N}
+ @end example
+ Specify the channels in use, by default 2 (stereo) is set.
+ @subsection @var{frame_size} AVOption
+ The syntax is:
+ @example
+ -frame_size @var{bytes}
+ @end example
+ Specify the number of byte per frame, by default it is set to 1024.
+ @subsection @var{fragment_size} AVOption
+ The syntax is:
+ @example
+ -fragment_size @var{bytes}
+ @end example
+ Specify the minimal buffering fragment in pulseaudio, it will affect the
+ audio latency. By default it is unset.
  @section sndio
  
  sndio input device.
@@@ -435,10 -282,10 +518,10 @@@ tools
  @example
  # Grab and show the input of a video4linux device, frame rate is set
  # to the default of 25/1.
 -avplay -s 320x240 -f video4linux /dev/video0
 +ffplay -s 320x240 -f video4linux /dev/video0
  
  # Grab and show the input of a video4linux2 device, autoadjust size.
 -avplay -f video4linux2 /dev/video0
 +ffplay -f video4linux2 /dev/video0
  
  # Grab and record the input of a video4linux2 device, autoadjust size,
  # frame rate value defaults to 0/0 so it is read from the video4linux2
diff --combined libavdevice/pulse.c
  
  /**
   * @file
-  * Pulseaudio input
+  * PulseAudio input using the simple API.
   * @author Luca Barbato <lu_zero@gentoo.org>
   *
-  * This avdevice decoder allows to capture audio from a Pulseaudio device using
-  * the simple api.
   */
  
  #include <pulse/simple.h>
@@@ -95,9 -93,9 +93,9 @@@ static av_cold int pulse_read_header(AV
          device = s->filename;
  
      pd->s = pa_simple_new(pd->server, pd->name,
-                       PA_STREAM_RECORD,
-                       device, pd->stream_name, &ss,
-                       NULL, &attr, &ret);
+                           PA_STREAM_RECORD,
+                           device, pd->stream_name, &ss,
+                           NULL, &attr, &ret);
  
      if (!pd->s) {
          av_log(s, AV_LOG_ERROR, "pa_simple_new failed: %s\n",
@@@ -122,7 -120,7 +120,7 @@@ static int pulse_read_packet(AVFormatCo
      int res;
      pa_usec_t latency;
      uint64_t frame_duration =
-         (pd->frame_size*1000000LL)/(pd->sample_rate * pd->channels);
+         (pd->frame_size*1000000LL) / (pd->sample_rate * pd->channels);
  
      if (av_new_packet(pkt, pd->frame_size) < 0) {
          return AVERROR(ENOMEM);
          pd->pts = -latency;
      }
  
-     pd->pts += frame_duration;
      pkt->pts = pd->pts;
  
+     pd->pts += frame_duration;
      return 0;
  }
  
@@@ -163,20 -161,13 +161,13 @@@ static av_cold int pulse_close(AVFormat
  #define D AV_OPT_FLAG_DECODING_PARAM
  
  static const AVOption options[] = {
-     { "server",        "pulse server name",
-         OFFSET(server),        AV_OPT_TYPE_STRING, {.str = NULL},     0, 0, D },
-     { "name",          "application name",
-         OFFSET(name),          AV_OPT_TYPE_STRING, {.str = LIBAVFORMAT_IDENT},  0, 0, D },
-     { "stream_name",   "stream description",
-         OFFSET(stream_name),   AV_OPT_TYPE_STRING, {.str = "record"}, 0, 0, D },
-     { "sample_rate",   "",
-         OFFSET(sample_rate),   AV_OPT_TYPE_INT,    {.dbl = 48000},    1, INT_MAX, D },
-     { "channels",      "",
-         OFFSET(channels),      AV_OPT_TYPE_INT,    {.dbl = 2},        1, INT_MAX, D },
-     { "frame_size",    "",
-         OFFSET(frame_size),    AV_OPT_TYPE_INT,    {.dbl = 1024},     1, INT_MAX, D },
-     { "fragment_size", "buffering size, affects latency and cpu usage",
-         OFFSET(fragment_size), AV_OPT_TYPE_INT,    {.dbl = -1},      -1, INT_MAX, D },
+     { "server",        "pulse server name",                              OFFSET(server),        AV_OPT_TYPE_STRING, {.str = NULL},     0, 0, D },
 -    { "name",          "application name",                               OFFSET(name),          AV_OPT_TYPE_STRING, {.str = "libav"},  0, 0, D },
++    { "name",          "application name",                               OFFSET(name),          AV_OPT_TYPE_STRING, {.str = LIBAVFORMAT_IDENT},  0, 0, D },
+     { "stream_name",   "stream description",                             OFFSET(stream_name),   AV_OPT_TYPE_STRING, {.str = "record"}, 0, 0, D },
+     { "sample_rate",   "sample rate in Hz",                              OFFSET(sample_rate),   AV_OPT_TYPE_INT,    {.dbl = 48000},    1, INT_MAX, D },
+     { "channels",      "number of audio channels",                       OFFSET(channels),      AV_OPT_TYPE_INT,    {.dbl = 2},        1, INT_MAX, D },
+     { "frame_size",    "number of bytes per frame",                      OFFSET(frame_size),    AV_OPT_TYPE_INT,    {.dbl = 1024},     1, INT_MAX, D },
+     { "fragment_size", "buffering size, affects latency and cpu usage",  OFFSET(fragment_size), AV_OPT_TYPE_INT,    {.dbl = -1},      -1, INT_MAX, D },
      { NULL },
  };
  
diff --combined libavformat/iv8.c
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * Copyright (c) 2009 Michael Niedermayer
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -55,33 -55,56 +55,56 @@@ static int read_header(AVFormatContext 
  
  static int read_packet(AVFormatContext *s, AVPacket *pkt)
  {
-     int ret, size, pts, type;
- retry:
-     type= avio_rb16(s->pb); // 257 or 258
-     size= avio_rb16(s->pb);
-     avio_rb16(s->pb); //some flags, 0x80 indicates end of frame
-     avio_rb16(s->pb); //packet number
-     pts=avio_rb32(s->pb);
-     avio_rb32(s->pb); //6A 13 E3 88
-     size -= 12;
-     if(size<1)
-         return -1;
-     if(type==258){
-         avio_skip(s->pb, size);
-         goto retry;
+     int ret, size, pts, type, flags;
+     int first_pkt      = 0;
+     int frame_complete = 0;
+     while (!frame_complete) {
+         type  = avio_rb16(s->pb); // 257 or 258
+         size  = avio_rb16(s->pb);
+         flags = avio_rb16(s->pb); //some flags, 0x80 indicates end of frame
+                 avio_rb16(s->pb); //packet number
+         pts   = avio_rb32(s->pb);
+                 avio_rb32(s->pb); //6A 13 E3 88
+         frame_complete = flags & 0x80;
+         size -= 12;
+         if (size < 1)
+             return -1;
+         if (type == 258) {
+             avio_skip(s->pb, size);
+             frame_complete = 0;
+             continue;
+         }
+         if (!first_pkt) {
+             ret = av_get_packet(s->pb, pkt, size);
+             if (ret < 0)
+                 return ret;
+             first_pkt = 1;
+             pkt->pts  = pts;
+             pkt->pos -= 16;
+         } else {
+             ret = av_append_packet(s->pb, pkt, size);
+             if (ret < 0) {
+                 av_log(s, AV_LOG_ERROR, "failed to grow packet\n");
+                 av_free_packet(pkt);
+                 return ret;
+             }
+         }
+         if (ret < size) {
+             av_log(s, AV_LOG_ERROR, "Truncated packet! Read %d of %d bytes\n",
+                    ret, size);
+             pkt->flags |= AV_PKT_FLAG_CORRUPT;
+             break;
+         }
      }
-     ret= av_get_packet(s->pb, pkt, size);
-     pkt->pts= pts;
-     pkt->pos-=16;
      pkt->stream_index = 0;
  
-     return ret;
+     return 0;
  }
  
  AVInputFormat ff_iv8_demuxer = {