Merge commit '9fcc632249be3080836a3afce25b3092939743ac' into release/2.2
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 20 Sep 2014 12:40:54 +0000 (14:40 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 20 Sep 2014 12:40:54 +0000 (14:40 +0200)
* commit '9fcc632249be3080836a3afce25b3092939743ac':
  pulse: Add a wallclock option to be compatible with other other captures

Conflicts:
libavdevice/pulse_audio_dec.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavdevice/pulse_audio_dec.c

  #include <pulse/simple.h>
  #include <pulse/rtclock.h>
  #include <pulse/error.h>
 -
  #include "libavformat/avformat.h"
  #include "libavformat/internal.h"
+ #include "libavutil/time.h"
  #include "libavutil/opt.h"
 +#include "pulse_audio_common.h"
  
  #define DEFAULT_CODEC_ID AV_NE(AV_CODEC_ID_PCM_S16BE, AV_CODEC_ID_PCM_S16LE)
  
@@@ -47,8 -48,26 +48,9 @@@ typedef struct PulseData 
      pa_simple *s;
      int64_t pts;
      int64_t frame_duration;
+     int wallclock;
  } PulseData;
  
 -static pa_sample_format_t codec_id_to_pulse_format(int codec_id) {
 -    switch (codec_id) {
 -    case AV_CODEC_ID_PCM_U8:    return PA_SAMPLE_U8;
 -    case AV_CODEC_ID_PCM_ALAW:  return PA_SAMPLE_ALAW;
 -    case AV_CODEC_ID_PCM_MULAW: return PA_SAMPLE_ULAW;
 -    case AV_CODEC_ID_PCM_S16LE: return PA_SAMPLE_S16LE;
 -    case AV_CODEC_ID_PCM_S16BE: return PA_SAMPLE_S16BE;
 -    case AV_CODEC_ID_PCM_F32LE: return PA_SAMPLE_FLOAT32LE;
 -    case AV_CODEC_ID_PCM_F32BE: return PA_SAMPLE_FLOAT32BE;
 -    case AV_CODEC_ID_PCM_S32LE: return PA_SAMPLE_S32LE;
 -    case AV_CODEC_ID_PCM_S32BE: return PA_SAMPLE_S32BE;
 -    case AV_CODEC_ID_PCM_S24LE: return PA_SAMPLE_S24LE;
 -    case AV_CODEC_ID_PCM_S24BE: return PA_SAMPLE_S24BE;
 -    default:                 return PA_SAMPLE_INVALID;
 -    }
 -}
 -
  static av_cold int pulse_read_header(AVFormatContext *s)
  {
      PulseData *pd = s->priv_data;
@@@ -121,16 -135,16 +123,18 @@@ static int pulse_read_packet(AVFormatCo
          return AVERROR(EIO);
      }
  
 -    if ((latency = pa_simple_get_latency(pd->s, &res)) == (pa_usec_t) -1) {
 -        av_log(s, AV_LOG_ERROR, "pa_simple_get_latency() failed: %s\n",
 -               pa_strerror(res));
 -        return AVERROR(EIO);
 -    }
 -
      if (pd->pts == AV_NOPTS_VALUE) {
 +        pa_usec_t latency;
 +
 +        if ((latency = pa_simple_get_latency(pd->s, &res)) == (pa_usec_t) -1) {
 +            av_log(s, AV_LOG_ERROR, "pa_simple_get_latency() failed: %s\n",
 +                   pa_strerror(res));
 +            return AVERROR(EIO);
 +        }
 +
          pd->pts = -latency;
+         if (pd->wallclock)
+             pd->pts += av_gettime();
      }
  
      pkt->pts = pd->pts;
@@@ -151,13 -165,14 +155,14 @@@ 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 = "libav"},  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,    {.i64 = 48000},    1, INT_MAX, D },
 -    { "channels",      "number of audio channels",                       OFFSET(channels),      AV_OPT_TYPE_INT,    {.i64 = 2},        1, INT_MAX, D },
 -    { "frame_size",    "number of bytes per frame",                      OFFSET(frame_size),    AV_OPT_TYPE_INT,    {.i64 = 1024},     1, INT_MAX, D },
 -    { "fragment_size", "buffering size, affects latency and cpu usage",  OFFSET(fragment_size), AV_OPT_TYPE_INT,    {.i64 = -1},      -1, INT_MAX, D },
 +    { "server",        "set PulseAudio server",                             OFFSET(server),        AV_OPT_TYPE_STRING, {.str = NULL},     0, 0, D },
 +    { "name",          "set application name",                              OFFSET(name),          AV_OPT_TYPE_STRING, {.str = LIBAVFORMAT_IDENT},  0, 0, D },
 +    { "stream_name",   "set stream description",                            OFFSET(stream_name),   AV_OPT_TYPE_STRING, {.str = "record"}, 0, 0, D },
 +    { "sample_rate",   "set sample rate in Hz",                             OFFSET(sample_rate),   AV_OPT_TYPE_INT,    {.i64 = 48000},    1, INT_MAX, D },
 +    { "channels",      "set number of audio channels",                      OFFSET(channels),      AV_OPT_TYPE_INT,    {.i64 = 2},        1, INT_MAX, D },
 +    { "frame_size",    "set number of bytes per frame",                     OFFSET(frame_size),    AV_OPT_TYPE_INT,    {.i64 = 1024},     1, INT_MAX, D },
 +    { "fragment_size", "set buffering size, affects latency and cpu usage", OFFSET(fragment_size), AV_OPT_TYPE_INT,    {.i64 = -1},      -1, INT_MAX, D },
+     { "wallclock",     "set the initial pts using the current time",     OFFSET(wallclock),     AV_OPT_TYPE_INT,    {.i64 = 1},       -1, 1, D },
      { NULL },
  };