]> git.sesse.net Git - ffmpeg/blobdiff - libswresample/swresample.c
avcodec_decode_audio: do not trust the channel layout, use the channel count.
[ffmpeg] / libswresample / swresample.c
index 6f1c41bc5c377c3d4886b0f5016c9b1614ad115b..ad33467e2a3aaab39752aa5aa6d4b83c5ddab70e 100644 (file)
@@ -818,6 +818,13 @@ int swr_inject_silence(struct SwrContext *s, int count){
     if(count <= 0)
         return 0;
 
+#define MAX_SILENCE_STEP 16384
+    while (count > MAX_SILENCE_STEP) {
+        if ((ret = swr_inject_silence(s, MAX_SILENCE_STEP)) < 0)
+            return ret;
+        count -= MAX_SILENCE_STEP;
+    }
+
     if((ret=swri_realloc_audio(&s->silence, count))<0)
         return ret;
 
@@ -866,7 +873,7 @@ int64_t swr_next_pts(struct SwrContext *s, int64_t pts){
     if(s->min_compensation >= FLT_MAX) {
         return (s->outpts = pts - swr_get_delay(s, s->in_sample_rate * (int64_t)s->out_sample_rate));
     } else {
-        int64_t delta = pts - swr_get_delay(s, s->in_sample_rate * (int64_t)s->out_sample_rate) - s->outpts;
+        int64_t delta = pts - swr_get_delay(s, s->in_sample_rate * (int64_t)s->out_sample_rate) - s->outpts + s->drop_output*(int64_t)s->in_sample_rate;
         double fdelta = delta /(double)(s->in_sample_rate * (int64_t)s->out_sample_rate);
 
         if(fabs(fdelta) > s->min_compensation) {