filter/ffmpeg: fill AVFrame::pts
Some libavfilter plugins don't produce any output if `pts` is never set, e.g. the `lowpass` plugin. Closes https://github.com/MusicPlayerDaemon/MPD/issues/2114
This commit is contained in:
2
NEWS
2
NEWS
@@ -1,6 +1,8 @@
|
|||||||
ver 0.23.16 (not yet released)
|
ver 0.23.16 (not yet released)
|
||||||
* database
|
* database
|
||||||
- fix integer overflows with 64-bit inode numbers
|
- fix integer overflows with 64-bit inode numbers
|
||||||
|
* filter
|
||||||
|
- ffmpeg: fix for filters producing no output
|
||||||
* support libfmt 11
|
* support libfmt 11
|
||||||
* support ICU 76
|
* support ICU 76
|
||||||
|
|
||||||
|
@@ -66,6 +66,9 @@ FfmpegFilter::FilterPCM(ConstBuffer<void> src)
|
|||||||
#endif
|
#endif
|
||||||
frame->nb_samples = src.size / in_audio_frame_size;
|
frame->nb_samples = src.size / in_audio_frame_size;
|
||||||
|
|
||||||
|
frame->pts = pts;
|
||||||
|
pts += frame->nb_samples;
|
||||||
|
|
||||||
frame.GetBuffer();
|
frame.GetBuffer();
|
||||||
|
|
||||||
memcpy(frame.GetData(0), src.data, src.size);
|
memcpy(frame.GetData(0), src.data, src.size);
|
||||||
|
@@ -17,14 +17,15 @@
|
|||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MPD_FFMPEG_FILTER__HXX
|
#pragma once
|
||||||
#define MPD_FFMPEG_FILTER__HXX
|
|
||||||
|
|
||||||
#include "filter/Filter.hxx"
|
#include "filter/Filter.hxx"
|
||||||
#include "lib/ffmpeg/Buffer.hxx"
|
#include "lib/ffmpeg/Buffer.hxx"
|
||||||
#include "lib/ffmpeg/Filter.hxx"
|
#include "lib/ffmpeg/Filter.hxx"
|
||||||
#include "lib/ffmpeg/Frame.hxx"
|
#include "lib/ffmpeg/Frame.hxx"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A #Filter implementation using FFmpeg's libavfilter.
|
* A #Filter implementation using FFmpeg's libavfilter.
|
||||||
*/
|
*/
|
||||||
@@ -46,6 +47,11 @@ class FfmpegFilter final : public Filter {
|
|||||||
const size_t in_audio_frame_size;
|
const size_t in_audio_frame_size;
|
||||||
const size_t out_audio_frame_size;
|
const size_t out_audio_frame_size;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Presentation timestamp. A counter for `AVFrame::pts`.
|
||||||
|
*/
|
||||||
|
int_least64_t pts = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @param _graph a checked and configured AVFilterGraph
|
* @param _graph a checked and configured AVFilterGraph
|
||||||
@@ -63,5 +69,3 @@ public:
|
|||||||
/* virtual methods from class Filter */
|
/* virtual methods from class Filter */
|
||||||
ConstBuffer<void> FilterPCM(ConstBuffer<void> src) override;
|
ConstBuffer<void> FilterPCM(ConstBuffer<void> src) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
Reference in New Issue
Block a user