Commit d20c6fb5 authored by Albert Astals Cid's avatar Albert Astals Cid
Browse files

Remove ffmpeg decoder plugin

It's only used when writing AAC, WMA, WavPack and APE to a CD-Audio and it
doesn't even seem to work nowadays (i get audio garbage for half [*], the
other half don't even let you drag them to the view) and on top of that
with ffmpeg5 doesn't even compile.

Removing for good, someone will need to rewrite it if they care about
those file formats

[*] My interpretation is that it assumes the output will be in a very
specific format but doesn't necessarily is
parent 45dd6714
Pipeline #141837 passed with stage
in 3 minutes and 31 seconds
......@@ -37,7 +37,6 @@ option(K3B_ENABLE_TAGLIB "Support for reading audio file metadata using Taglib."
option(K3B_BUILD_API_DOCS "Build the API documentation for the K3b libs." OFF)
# plugin options
option(K3B_BUILD_FFMPEG_DECODER_PLUGIN "Build FFmpeg decoder plugin" ON)
option(K3B_BUILD_OGGVORBIS_DECODER_PLUGIN "Build Ogg-Vorbis decoder plugin" ON)
option(K3B_BUILD_OGGVORBIS_ENCODER_PLUGIN "Build Ogg-Vorbis encoder plugin" ON)
option(K3B_BUILD_MAD_DECODER_PLUGIN "Build MAD mp3 decoder plugin" ON)
......@@ -125,69 +124,6 @@ if(K3B_ENABLE_MUSICBRAINZ)
set(ENABLE_MUSICBRAINZ "${MUSICBRAINZ_FOUND}")
endif()
if(K3B_BUILD_FFMPEG_DECODER_PLUGIN)
find_package(FFmpeg)
set_package_properties(FFmpeg PROPERTIES
PURPOSE "Needed for the K3b FFmpeg decoder plugin which can decode virtually all audio types."
URL "https://ffmpeg.org/"
TYPE OPTIONAL)
if(FFMPEG_FOUND)
include(CheckSymbolExists)
include(CMakePushCheckState)
cmake_push_check_state()
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
# FindKDE4Internal.cmake screws things up
set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} -std=c99)
endif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(FFMPEG_INCLUDE_DIR_OLD_STYLE)
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${FFMPEG_INCLUDE_DIR_OLD_STYLE})
set(FFMPEG_HEADERS ffmpeg/avcodec.h ffmpeg/avformat.h)
else(FFMPEG_INCLUDE_DIR_OLD_STYLE)
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${FFMPEG_INCLUDE_DIR} ${FFMPEG_INCLUDE_DIRS})
set(FFMPEG_HEADERS libavcodec/avcodec.h libavformat/avformat.h)
set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -DNEWFFMPEGAVCODECPATH)
endif(FFMPEG_INCLUDE_DIR_OLD_STYLE)
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${FFMPEG_LIBRARIES})
check_symbol_exists(avformat_open_input "${FFMPEG_HEADERS}" HAVE_FFMPEG_AVFORMAT_OPEN_INPUT)
check_symbol_exists(av_dump_format "${FFMPEG_HEADERS}" HAVE_FFMPEG_AV_DUMP_FORMAT)
check_symbol_exists(avformat_find_stream_info "${FFMPEG_HEADERS}" HAVE_FFMPEG_AVFORMAT_FIND_STREAM_INFO)
check_symbol_exists(avformat_close_input "${FFMPEG_HEADERS}" HAVE_FFMPEG_AVFORMAT_CLOSE_INPUT)
check_symbol_exists(avcodec_open2 "${FFMPEG_HEADERS}" HAVE_FFMPEG_AVCODEC_OPEN2)
include(CheckCSourceCompiles)
check_c_source_compiles("
#ifdef NEWFFMPEGAVCODECPATH
#include <libavcodec/avcodec.h>
#else
#include <ffmpeg/avcodec.h>
#endif
int main() { enum AVMediaType t = AVMEDIA_TYPE_UNKNOWN; return 0; }
" HAVE_FFMPEG_AVMEDIA_TYPE)
check_c_source_compiles("
#ifdef NEWFFMPEGAVCODECPATH
#include <libavcodec/avcodec.h>
#else
#include <ffmpeg/avcodec.h>
#endif
int main() {
#if LIBAVCODEC_BUILD >= AV_VERSION_INT(54,25,0)
# Not needed here. AV_CODEC_ID_MP3 exists.
#else
enum CodecID t = CODEC_ID_MP3;
#endif
return 0;
}
" HAVE_FFMPEG_CODEC_MP3)
cmake_pop_check_state()
endif(FFMPEG_FOUND)
set(BUILD_FFMPEG_DECODER_PLUGIN "${FFMPEG_FOUND}")
endif(K3B_BUILD_FFMPEG_DECODER_PLUGIN)
if(K3B_BUILD_FLAC_DECODER_PLUGIN)
find_package(Flac)
set_package_properties(Flac PROPERTIES
......
......@@ -21,11 +21,9 @@ What you need to run K3b:
- the eMovix package
- TagLib by Scott Wheeler for reading Meta data tags
- the musepack (or now mpcdec) library for decoding Musepack audio files
- the ffmpeg library to decode other audio file formats such as wma
- the sndfile library to decode audio file formats such as AIFF or VOC
- the lame library to encode audio files in the mp3 format
- sox to encode audio files in formats such as AIFF or VOC
- a dynamically compiled libffmpeg for wma decoding
- the musicbrainz library for metadata queries for single audio titles
- polkit-qt for K3bSetup (tool for changing permissions of programs and devices)
......
# vim: ts=2 sw=2
# - Try to find the required ffmpeg components(default: AVFORMAT, AVUTIL, AVCODEC)
#
# Once done this will define
# FFMPEG_FOUND - System has the all required components.
# FFMPEG_INCLUDE_DIRS - Include directory necessary for using the required components headers.
# FFMPEG_LIBRARIES - Link these to use the required ffmpeg components.
# FFMPEG_DEFINITIONS - Compiler switches required for using the required ffmpeg components.
#
# For each of the components it will additionally set.
# - AVCODEC
# - AVDEVICE
# - AVFORMAT
# - AVUTIL
# - POSTPROCESS
# - SWSCALE
# the following variables will be defined
# <component>_FOUND - System has <component>
# <component>_INCLUDE_DIRS - Include directory necessary for using the <component> headers
# <component>_LIBRARIES - Link these to use <component>
# <component>_DEFINITIONS - Compiler switches required for using <component>
# <component>_VERSION - The components version
#
# SPDX-FileCopyrightText: 2006 Matthias Kretz <kretz@kde.org>
# SPDX-FileCopyrightText: 2008 Alexander Neundorf <neundorf@kde.org>
# SPDX-FileCopyrightText: 2011 Michael Jansen <kde@michael-jansen.biz>
# SPDX-License-Identifier: BSD-3-Clause
include(FindPackageHandleStandardArgs)
# The default components were taken from a survey over other FindFFMPEG.cmake files
if (NOT FFmpeg_FIND_COMPONENTS)
set(FFmpeg_FIND_COMPONENTS AVCODEC AVFORMAT AVUTIL)
endif ()
#
### Macro: set_component_found
#
# Marks the given component as found if both *_LIBRARIES AND *_INCLUDE_DIRS is present.
#
macro(set_component_found _component )
if (${_component}_LIBRARIES AND ${_component}_INCLUDE_DIRS)
# message(STATUS " - ${_component} found.")
set(${_component}_FOUND TRUE)
else ()
# message(STATUS " - ${_component} not found.")
endif ()
endmacro()
#
### Macro: find_component
#
# Checks for the given component by invoking pkgconfig and then looking up the libraries and
# include directories.
#
macro(find_component _component _pkgconfig _library _header)
if (NOT WIN32)
# use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls
find_package(PkgConfig)
if (PKG_CONFIG_FOUND)
pkg_check_modules(PC_${_component} ${_pkgconfig})
endif ()
endif (NOT WIN32)
find_path(${_component}_INCLUDE_DIRS ${_header}
HINTS
${PC_LIB${_component}_INCLUDEDIR}
${PC_LIB${_component}_INCLUDE_DIRS}
PATH_SUFFIXES
ffmpeg
)
find_library(${_component}_LIBRARIES NAMES ${_library}
HINTS
${PC_LIB${_component}_LIBDIR}
${PC_LIB${_component}_LIBRARY_DIRS}
)
set(${_component}_DEFINITIONS ${PC_${_component}_CFLAGS_OTHER} CACHE STRING "The ${_component} CFLAGS.")
set(${_component}_VERSION ${PC_${_component}_VERSION} CACHE STRING "The ${_component} version number.")
set_component_found(${_component})
mark_as_advanced(
${_component}_INCLUDE_DIRS
${_component}_LIBRARIES
${_component}_DEFINITIONS
${_component}_VERSION)
endmacro()
# Check for cached results. If there are skip the costly part.
if (NOT FFMPEG_LIBRARIES)
# Check for all possible component.
find_component(AVCODEC libavcodec avcodec libavcodec/avcodec.h)
find_component(AVFORMAT libavformat avformat libavformat/avformat.h)
find_component(AVDEVICE libavdevice avdevice libavdevice/avdevice.h)
find_component(AVUTIL libavutil avutil libavutil/avutil.h)
find_component(SWSCALE libswscale swscale libswscale/swscale.h)
find_component(POSTPROC libpostproc postproc libpostproc/postprocess.h)
# Check if the required components were found and add their stuff to the FFMPEG_* vars.
foreach (_component ${FFmpeg_FIND_COMPONENTS})
if (${_component}_FOUND)
# message(STATUS "Required component ${_component} present.")
set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} ${${_component}_LIBRARIES})
set(FFMPEG_DEFINITIONS ${FFMPEG_DEFINITIONS} ${${_component}_DEFINITIONS})
list(APPEND FFMPEG_INCLUDE_DIRS ${${_component}_INCLUDE_DIRS})
else ()
# message(STATUS "Required component ${_component} missing.")
endif ()
endforeach ()
# Build the include path with duplicates removed.
if (FFMPEG_INCLUDE_DIRS)
list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS)
endif ()
# cache the vars.
set(FFMPEG_INCLUDE_DIRS ${FFMPEG_INCLUDE_DIRS} CACHE STRING "The FFmpeg include directories." FORCE)
set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} CACHE STRING "The FFmpeg libraries." FORCE)
set(FFMPEG_DEFINITIONS ${FFMPEG_DEFINITIONS} CACHE STRING "The FFmpeg cflags." FORCE)
mark_as_advanced(FFMPEG_INCLUDE_DIRS
FFMPEG_LIBRARIES
FFMPEG_DEFINITIONS)
endif ()
# Now set the noncached _FOUND vars for the components.
foreach (_component AVCODEC AVDEVICE AVFORMAT AVUTIL POSTPROCESS SWSCALE)
set_component_found(${_component})
endforeach ()
# Compile the list of required vars
set(_FFmpeg_REQUIRED_VARS FFMPEG_LIBRARIES FFMPEG_INCLUDE_DIRS)
foreach (_component ${FFmpeg_FIND_COMPONENTS})
list(APPEND _FFmpeg_REQUIRED_VARS ${_component}_LIBRARIES ${_component}_INCLUDE_DIRS)
endforeach ()
# Give a nice error message if some of the required vars are missing.
find_package_handle_standard_args(FFmpeg DEFAULT_MSG ${_FFmpeg_REQUIRED_VARS})
......@@ -26,14 +26,3 @@
#cmakedefine HAVE_ICONV
#cmakedefine ICONV_SECOND_ARGUMENT_IS_CONST
#cmakedefine HAVE_FFMPEG_AVFORMAT_OPEN_INPUT
#cmakedefine HAVE_FFMPEG_AV_DUMP_FORMAT
#cmakedefine HAVE_FFMPEG_AVFORMAT_FIND_STREAM_INFO
#cmakedefine HAVE_FFMPEG_AVFORMAT_CLOSE_INPUT
#cmakedefine HAVE_FFMPEG_AVCODEC_OPEN2
#cmakedefine HAVE_FFMPEG_AVCODEC_DECODE_AUDIO2
#cmakedefine HAVE_FFMPEG_AVCODEC_DECODE_AUDIO3
#cmakedefine HAVE_FFMPEG_AVCODEC_DECODE_AUDIO4
#cmakedefine HAVE_FFMPEG_AVMEDIA_TYPE
#cmakedefine HAVE_FFMPEG_CODEC_MP3
......@@ -6,10 +6,6 @@ if(BUILD_OGGVORBIS_DECODER_PLUGIN)
add_subdirectory(ogg)
endif()
if(BUILD_FFMPEG_DECODER_PLUGIN)
add_subdirectory(ffmpeg)
endif()
if(BUILD_FLAC_DECODER_PLUGIN)
add_subdirectory(flac)
endif()
......
kcoreaddons_add_plugin(k3bffmpegdecoder
SOURCES k3bffmpegdecoder.cpp k3bffmpegwrapper.cpp
INSTALL_NAMESPACE "k3b")
if(FFMPEG_INCLUDE_DIR_OLD_STYLE)
message(STATUS "didn't find new ffmpegcodecpath")
target_include_directories(k3bffmpegdecoder PRIVATE ${FFMPEG_INCLUDE_DIR_OLD_STYLE})
else()
message(STATUS "found new ffmpegcodecpath")
target_compile_definitions(k3bffmpegdecoder PRIVATE NEWFFMPEGAVCODECPATH)
target_include_directories(k3bffmpegdecoder PRIVATE ${FFMPEG_INCLUDE_DIR} ${FFMPEG_INCLUDE_DIRS})
endif()
target_link_libraries(k3bffmpegdecoder k3bdevice k3blib KF5::I18n ${FFMPEG_LIBRARIES})
/*
SPDX-FileCopyrightText: 1998-2008 Sebastian Trueg <trueg@k3b.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "k3bffmpegdecoder.h"
#include "k3bffmpegwrapper.h"
#include <config-k3b.h>
#include <QDebug>
extern "C" {
/*
Recent versions of FFmpeg uses C99 constant macros which are not present in C++ standard.
The macro __STDC_CONSTANT_MACROS allow C++ to use these macros. Although it's not defined by C++ standard
it's supported by many implementations.
See bug 236036 and discussion: https://lists.ffmpeg.org/pipermail/ffmpeg-devel/2010-May/095488.html
*/
#define __STDC_CONSTANT_MACROS
#ifdef NEWFFMPEGAVCODECPATH
#include <libavcodec/avcodec.h>
#else
#include <ffmpeg/avcodec.h>
#endif
}
#include <math.h>
K_PLUGIN_CLASS_WITH_JSON(K3bFFMpegDecoderFactory, "k3bffmpegdecoder.json")
K3bFFMpegDecoderFactory::K3bFFMpegDecoderFactory( QObject* parent, const QVariantList& )
: K3b::AudioDecoderFactory( parent )
{
}
K3bFFMpegDecoderFactory::~K3bFFMpegDecoderFactory()
{
}
K3b::AudioDecoder* K3bFFMpegDecoderFactory::createDecoder( QObject* parent ) const
{
return new K3bFFMpegDecoder( parent);
}
bool K3bFFMpegDecoderFactory::canDecode( const QUrl& url )
{
K3bFFMpegFile* file = K3bFFMpegWrapper::instance()->open( url.toLocalFile() );
if( file ) {
delete file;
return true;
}
else {
return false;
}
}
K3bFFMpegDecoder::K3bFFMpegDecoder( QObject* parent )
: K3b::AudioDecoder( parent ),
m_file(0)
{
}
K3bFFMpegDecoder::~K3bFFMpegDecoder()
{
}
QString K3bFFMpegDecoder::fileType() const
{
return m_type;
}
bool K3bFFMpegDecoder::analyseFileInternal( K3b::Msf& frames, int& samplerate, int& ch )
{
m_file = K3bFFMpegWrapper::instance()->open( filename() );
if( m_file ) {
// TODO: call addTechnicalInfo
addMetaInfo( META_TITLE, m_file->title() );
addMetaInfo( META_ARTIST, m_file->author() );
addMetaInfo( META_COMMENT, m_file->comment() );
samplerate = m_file->sampleRate();
ch = m_file->channels();
m_type = m_file->typeComment();
frames = m_file->length();
// ffmpeg's length information is not reliable at all
// so we have to decode the whole file in order to get the correct length
// char buffer[10*2048];
// int len = 0;
// unsigned long long bytes = 0;
// while( ( len = m_file->read( buffer, 10*2048 ) ) > 0 )
// bytes += len;
// frames = (unsigned long)ceil((double)bytes/2048.0);
// cleanup;
delete m_file;
m_file = 0;
return true;
}
else
return false;
}
bool K3bFFMpegDecoder::initDecoderInternal()
{
if( !m_file )
m_file = K3bFFMpegWrapper::instance()->open( filename() );
return (m_file != 0);
}
void K3bFFMpegDecoder::cleanup()
{
delete m_file;
m_file = 0;
}
bool K3bFFMpegDecoder::seekInternal( const K3b::Msf& msf )
{
if( msf == 0 )
return initDecoderInternal();
else
return m_file->seek( msf );
}
int K3bFFMpegDecoder::decodeInternal( char* _data, int maxLen )
{
return m_file->read( _data, maxLen );
}
#include "k3bffmpegdecoder.moc"
/*
SPDX-FileCopyrightText: 1998-2008 Sebastian Trueg <trueg@k3b.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef _K3B_FFMPEG_DECODER_H_
#define _K3B_FFMPEG_DECODER_H_
#include "k3baudiodecoder.h"
class K3bFFMpegFile;
class K3bFFMpegDecoderFactory : public K3b::AudioDecoderFactory
{
Q_OBJECT
public:
K3bFFMpegDecoderFactory( QObject* parent, const QVariantList& args );
~K3bFFMpegDecoderFactory() override;
bool canDecode( const QUrl& filename ) override;
int pluginSystemVersion() const override { return K3B_PLUGIN_SYSTEM_VERSION; }
bool multiFormatDecoder() const override { return true; }
K3b::AudioDecoder* createDecoder( QObject* parent = 0 ) const override;
};
class K3bFFMpegDecoder : public K3b::AudioDecoder
{
Q_OBJECT
public:
explicit K3bFFMpegDecoder( QObject* parent = 0 );
~K3bFFMpegDecoder() override;
QString fileType() const override;
void cleanup() override;
protected:
bool analyseFileInternal( K3b::Msf& frames, int& samplerate, int& ch ) override;
bool initDecoderInternal() override;
bool seekInternal( const K3b::Msf& ) override;
int decodeInternal( char* _data, int maxLen ) override;
private:
K3bFFMpegFile* m_file;
QString m_type;
};
#endif
{
"KPlugin": {
"Authors": [
{
"Email": "trueg@k3b.org",
"Name": "Sebastian Trueg",
"Name[ca@valencia]": "Sebastian Trueg",
"Name[ca]": "Sebastian Trueg",
"Name[cs]": "Sebastian Trueg",
"Name[da]": "Sebastian Trueg",
"Name[de]": "Sebastian Trueg",
"Name[el]": "Sebastian Trueg",
"Name[en_GB]": "Sebastian Trueg",
"Name[es]": "Sebastian Trueg",
"Name[eu]": "Sebastian Trueg",
"Name[fi]": "Sebastian Trueg",
"Name[fr]": "Sebastian Trueg",
"Name[hu]": "Sebastian Trueg",
"Name[ia]": "Sebastian Trueg",
"Name[it]": "Sebastian Trueg",
"Name[ko]": "Sebastian Trueg",
"Name[nl]": "Sebastian Trueg",
"Name[pl]": "Sebastian Trueg",
"Name[pt]": "Sebastian Trueg",
"Name[pt_BR]": "Sebastian Trueg",
"Name[sl]": "Sebastian Trueg",
"Name[sv]": "Sebastian Trueg",
"Name[uk]": "Sebastian Trueg",
"Name[x-test]": "xxSebastian Truegxx",
"Name[zh_CN]": "Sebastian Trueg"
}
],
"Category": "AudioDecoder",
"Description": "Decoding module to decode WMA files",
"Description[ar]": "وحدة فكّ ترميز لفكّ ترميز ملفّات WMA",
"Description[bs]": "Modul dekodiranja za dekodiranje WMA datoteke",
"Description[ca@valencia]": "Mòdul de descodificació per a descodificar fitxers WMA",
"Description[ca]": "Mòdul de descodificació per a descodificar fitxers WMA",
"Description[cs]": "Modul pro dekódování souborů WMA",
"Description[da]": "Dekodermodul til dekodning af WMA-filer",
"Description[de]": "Dekodierungsmodul für WMA-Dateien",
"Description[el]": "Άρθρωμα αποκωδικοποίησης αρχείων WMA",
"Description[en_GB]": "Decoding module to decode WMA files",
"Description[es]": "Descodificando módulo para descodificar archivos WMA",
"Description[et]": "WMA-failide dekodeerimise moodul",
"Description[eu]": "WMA fitxategiak deskodetzeko modulua",
"Description[fi]": "WMA-tiedostojen purkumoduuli",
"Description[fr]": "Module de décodage pour des fichiers au format « WMA »",
"Description[gl]": "Módulo de descodificación para descodificar ficheiros WMA",
"Description[hu]": "Dekódolómodul WMA-fájlok dekódolásához",
"Description[ia]": "Modulo decifrante per decifrar files WMA",
"Description[id]": "Modul decoding untuk mendekode file-file WMA",
"Description[it]": "Decodifica modulare per i file WMA",
"Description[ko]": "WMA 파일 디코딩 모듈",
"Description[nl]": "Module voor het decoderen van WMA-bestanden",
"Description[nn]": "Modul for dekoding av WMA-filer",
"Description[pl]": "Moduł dekodujący pliki WMA",
"Description[pt]": "Módulo de descodificação de ficheiros WMA",
"Description[pt_BR]": "Módulo de decodificação de arquivos WMA",
"Description[ru]": "Модуль декодирования файлов WMA",
"Description[sk]": "Modul pre dekódovanie súborov WMA",
"Description[sl]": "Dekodirni modul za dekodiranje datotek WMA",
"Description[sr@ijekavian]": "Модул за декодирање ВМА фајлова",
"Description[sr@ijekavianlatin]": "Modul za dekodiranje WMA fajlova",
"Description[sr@latin]": "Modul za dekodiranje WMA fajlova",
"Description[sr]": "Модул за декодирање ВМА фајлова",
"Description[sv]": "Avkodningsmodul för att avkoda WMA-filer",
"Description[tr]": "WMA dosyalarının kodlarını çözmek için çözücü modül",
"Description[uk]": "Модуль для декодування файлів WMA",
"Description[x-test]": "xxDecoding module to decode WMA filesxx",
"Description[zh_CN]": "用于解码 WMA 文件的解码模块",
"Description[zh_TW]": "解碼 WMA 檔案格式的模組",
"EnabledByDefault": true,
"Icon": "preferences-plugin",
"Id": "k3bffmpegdecoder",
"License": "GPL",
"Name": "K3b FFMpeg Decoder",
"Name[bg]": "FFMpeg декодер за K3b",
"Name[bs]": "K3b FFMpeg Dekoder",
"Name[ca@valencia]": "Descodificador FFMpeg del K3b",
"Name[ca]": "Descodificador FFMpeg del K3b",
"Name[cs]": "FFMpeg dekodér K3b",
"Name[csb]": "Dekòder FFMpeg dlô K3b",
"Name[da]": "K3b FFMpeg-dekoder",
"Name[de]": "FFMpeg-Dekodierer",
"Name[el]": "Αποκωδικοποιητής FFMpeg του K3b",
"Name[en_GB]": "K3b FFMpeg Decoder",
"Name[es]": "Decodificador FFMpeg de K3b",
"Name[et]": "K3b FFMpeg dekodeerija",
"Name[eu]": "K3b FFMpeg deskodetzailea",
"Name[fi]": "K3b:n FFMpeg-purkaja",
"Name[fr]": "Décodeur « FFMpeg » pour K3b",
"Name[ga]": "Díchódóir FFMpeg K3b",
"Name[gl]": "Descodificador FFMpeg para o K3b",
"Name[he]": "מפענח FFMpeg של K3b",
"Name[hne]": "के3बी एफएफएमपीईजी डिकोडर",
"Name[hr]": "K3b-ov FFMpeg dekoder",
"Name[hu]": "FFMpeg-dekódoló a K3b-hez",
"Name[ia]": "Decifrator FFMpeg de K3b",
"Name[id]": "Dekoder FFMpeg K3b",
"Name[is]": "K3b FFMpeg afkóðari",
"Name[it]": "Decodificatore FFMpeg di K3b",
"Name[ja]": "K3b FFMpeg デコーダ",
"Name[kk]": "K3b FFMpeg декодері",
"Name[km]": "ឌិកូឌ័រ FFMpeg របស់​ K3b",
"Name[ko]": "K3b FFMpeg 디코더",
"Name[lt]": "K3b FFMpeg dekoderis",
"Name[lv]": "K3b FFMpeg dekoderis",
"Name[mr]": "के3बी FFMpeg डीकोडर",
"Name[nb]": "K3b FFMpeg dekoder",
"Name[nds]": "FFMpeg-Dekoderer för K3b",
"Name[nl]": "K3b FFMpeg-decoder",
"Name[nn]": "FFMpeg-dekodar for K3b",
"Name[pa]": "K3b FFMpeg ਡੀਕੋਡਰ",
"Name[pl]": "Dekoder FFMpeg dla K3b",
"Name[pt]": "Descodificador de FFMpeg do K3b",
"Name[pt_BR]": "Decodificador FFMpeg do K3b",
"Name[ro]": "Decodor K3b FFMpeg",