Commit 7341cec2 authored by Mikalai S.'s avatar Mikalai S. Committed by Albert Astals Cid
Browse files

Revert "Remove ffmpeg decoder plugin"

This reverts commit d20c6fb5.
parent d523e6c8
......@@ -37,6 +37,7 @@ 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)
......@@ -124,6 +125,69 @@ 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,9 +21,11 @@ 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})
......@@ -28,3 +28,14 @@
#cmakedefine ICONV_SECOND_ARGUMENT_IS_CONST
#cmakedefine HAVE_FSTAB_H
#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,6 +6,10 @@ 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",
"Name[ru]": "Декодер FFMpeg",