]> git.sesse.net Git - ffmpeg/blobdiff - libavdevice/alsa-audio-enc.c
Merge commit 'b45c87083de67969c1598cfef41e7c947b137922'
[ffmpeg] / libavdevice / alsa-audio-enc.c
index 0f4e4a2c7a402d1bd006816ddae0d98dfb6717d1..83e1d2f85f0b83cafcd011557c04b17cb87f31ba 100644 (file)
 static av_cold int audio_write_header(AVFormatContext *s1)
 {
     AlsaData *s = s1->priv_data;
-    AVStream *st;
+    AVStream *st = NULL;
     unsigned int sample_rate;
     enum AVCodecID codec_id;
     int res;
 
+    if (s1->nb_streams != 1 || s1->streams[0]->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
+        av_log(s1, AV_LOG_ERROR, "Only a single audio stream is supported.\n");
+        return AVERROR(EINVAL);
+    }
     st = s1->streams[0];
+
     sample_rate = st->codec->sample_rate;
     codec_id    = st->codec->codec_id;
     res = ff_alsa_open(s1, SND_PCM_STREAM_PLAYBACK, &sample_rate,
@@ -80,6 +85,10 @@ static int audio_write_packet(AVFormatContext *s1, AVPacket *pkt)
     uint8_t *buf = pkt->data;
 
     size /= s->frame_size;
+    if (pkt->dts != AV_NOPTS_VALUE)
+        s->timestamp = pkt->dts;
+    s->timestamp += pkt->duration ? pkt->duration : size;
+
     if (s->reorder_func) {
         if (size > s->reorder_buf_size)
             if (ff_alsa_extend_reorder_buf(s, size))
@@ -112,7 +121,7 @@ audio_get_output_timestamp(AVFormatContext *s1, int stream,
     snd_pcm_sframes_t delay = 0;
     *wall = av_gettime();
     snd_pcm_delay(s->h, &delay);
-    *dts = s1->streams[0]->cur_dts - delay;
+    *dts = s->timestamp - delay;
 }
 
 AVOutputFormat ff_alsa_muxer = {