]> git.sesse.net Git - ffmpeg/blobdiff - libavfilter/src_buffer.c
aresample: add code to flush the internal swr buffer.
[ffmpeg] / libavfilter / src_buffer.c
index 33b3ec70cba84a7464c889e1bb3bff0e86026d68..5bf629ce6b651fc864afa50d1732e5e07d0a9f2b 100644 (file)
@@ -270,6 +270,8 @@ static AVFilterBufferRef *copy_buffer_ref(AVFilterContext *ctx,
     case AVMEDIA_TYPE_VIDEO:
         buf = avfilter_get_video_buffer(outlink, AV_PERM_WRITE,
                                         ref->video->w, ref->video->h);
+        if(!buf)
+            return NULL;
         av_image_copy(buf->data, buf->linesize,
                       (void*)ref->data, ref->linesize,
                       ref->format, ref->video->w, ref->video->h);
@@ -278,12 +280,13 @@ static AVFilterBufferRef *copy_buffer_ref(AVFilterContext *ctx,
     case AVMEDIA_TYPE_AUDIO:
         buf = ff_get_audio_buffer(outlink, AV_PERM_WRITE,
                                         ref->audio->nb_samples);
+        if(!buf)
+            return NULL;
         channels = av_get_channel_layout_nb_channels(ref->audio->channel_layout);
-        data_size = av_samples_get_buffer_size(NULL, channels,
-                                               ref->audio->nb_samples,
-                                               ref->format, 1);
-        for (i = 0; i < FF_ARRAY_ELEMS(ref->buf->data) && ref->buf->data[i]; i++)
-            memcpy(buf->buf->data[i], ref->buf->data[i], data_size);
+        av_samples_copy(buf->extended_data, ref->buf->extended_data,
+                        0, 0, ref->audio->nb_samples,
+                        channels,
+                        ref->format);
         break;
 
     default:
@@ -320,6 +323,8 @@ int av_buffersrc_add_ref(AVFilterContext *buffer_filter,
         buf = picref;
     else
         buf = copy_buffer_ref(buffer_filter, picref);
+    if(!buf)
+        return -1;
 
     if ((ret = av_fifo_generic_write(c->fifo, &buf, sizeof(buf), NULL)) < 0) {
         if (buf != picref)
@@ -431,6 +436,7 @@ static av_cold int init_audio(AVFilterContext *ctx, const char *args0, void *opa
     if (*args)                                                          \
         arg = av_strtok(NULL, ":", &ptr)
 
+    ADD_FORMAT(time_base);
     ADD_FORMAT(sample_rate);
     ADD_FORMAT(sample_format);
     ADD_FORMAT(channel_layout);
@@ -517,6 +523,7 @@ static int config_output_audio(AVFilterLink *outlink)
 {
     BufferSourceContext *abuffer = outlink->src->priv;
     outlink->sample_rate = abuffer->sample_rate;
+    outlink->time_base   = abuffer->time_base;
     return 0;
 }