Cleaned up the source file names and code locations in the avcodec plugin,
unified the Reader and Decoder plugins and renamed the add-on to "ffmpeg". git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31358 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -122,7 +122,7 @@ SYSTEM_ADD_ONS_MEDIA = cortex_audioadapter.media_addon cortex_flanger.media_addo
|
|||||||
#legacy.media_addon
|
#legacy.media_addon
|
||||||
;
|
;
|
||||||
SYSTEM_ADD_ONS_MEDIA_PLUGINS = $(GPL_ONLY)ac3_decoder
|
SYSTEM_ADD_ONS_MEDIA_PLUGINS = $(GPL_ONLY)ac3_decoder
|
||||||
aiff_reader asf_reader au_reader $(X86_ONLY)avcodec avi_reader
|
aiff_reader asf_reader au_reader avi_reader $(X86_ONLY)ffmpeg
|
||||||
matroska mov_reader
|
matroska mov_reader
|
||||||
mp3_decoder mp3_reader
|
mp3_decoder mp3_reader
|
||||||
mp4_reader musepack
|
mp4_reader musepack
|
||||||
|
|||||||
+25
-85
@@ -3,23 +3,24 @@
|
|||||||
* Copyright (C) 2001 François Revol
|
* Copyright (C) 2001 François Revol
|
||||||
* Copyright (C) 2001 Axel Dörfler
|
* Copyright (C) 2001 Axel Dörfler
|
||||||
* Copyright (C) 2004 Marcus Overhagen
|
* Copyright (C) 2004 Marcus Overhagen
|
||||||
|
* Copyright (C) 2009 Stephan Amßus <superstippi@gmx.de>
|
||||||
*
|
*
|
||||||
* All rights reserved. Distributed under the terms of the MIT License.
|
* All rights reserved. Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//! libavcodec based decoder for Haiku
|
//! libavcodec based decoder for Haiku
|
||||||
|
|
||||||
|
#include "AVCodecDecoder.h"
|
||||||
|
|
||||||
#include <Debug.h>
|
#include <Debug.h>
|
||||||
#include <OS.h>
|
#include <OS.h>
|
||||||
#include <Bitmap.h>
|
#include <Bitmap.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "avcodecplugin.h"
|
|
||||||
|
|
||||||
#define DO_PROFILING 0
|
#define DO_PROFILING 0
|
||||||
|
|
||||||
#undef TRACE
|
#undef TRACE
|
||||||
//#define TRACE_AV_CODEC
|
#define TRACE_AV_CODEC
|
||||||
#ifdef TRACE_AV_CODEC
|
#ifdef TRACE_AV_CODEC
|
||||||
# define TRACE(x...) printf(x)
|
# define TRACE(x...) printf(x)
|
||||||
#else
|
#else
|
||||||
@@ -45,7 +46,7 @@ static long prof_cnt = 0;
|
|||||||
// with CD Manager)
|
// with CD Manager)
|
||||||
//#define UNREAL
|
//#define UNREAL
|
||||||
|
|
||||||
avCodec::avCodec()
|
AVCodecDecoder::AVCodecDecoder()
|
||||||
: fHeader(),
|
: fHeader(),
|
||||||
fInfo(),
|
fInfo(),
|
||||||
fInputFormat(),
|
fInputFormat(),
|
||||||
@@ -61,7 +62,7 @@ avCodec::avCodec()
|
|||||||
fBlockAlign(0),
|
fBlockAlign(0),
|
||||||
fOutputBuffer(0)
|
fOutputBuffer(0)
|
||||||
{
|
{
|
||||||
TRACE("avCodec::avCodec()\n");
|
TRACE("AVCodecDecoder::AVCodecDecoder()\n");
|
||||||
|
|
||||||
// prevent multiple inits
|
// prevent multiple inits
|
||||||
static volatile vint32 ff_init_count = 0;
|
static volatile vint32 ff_init_count = 0;
|
||||||
@@ -83,9 +84,9 @@ avCodec::avCodec()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
avCodec::~avCodec()
|
AVCodecDecoder::~AVCodecDecoder()
|
||||||
{
|
{
|
||||||
TRACE("[%c] avCodec::~avCodec()\n", isAudio?('a'):('v'));
|
TRACE("[%c] AVCodecDecoder::~AVCodecDecoder()\n", isAudio?('a'):('v'));
|
||||||
|
|
||||||
#ifdef DO_PROFILING
|
#ifdef DO_PROFILING
|
||||||
if (prof_cnt > 0) {
|
if (prof_cnt > 0) {
|
||||||
@@ -95,7 +96,7 @@ avCodec::~avCodec()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(fCodecInitDone)
|
if (fCodecInitDone)
|
||||||
avcodec_close(ffc);
|
avcodec_close(ffc);
|
||||||
|
|
||||||
free(opicture);
|
free(opicture);
|
||||||
@@ -108,7 +109,7 @@ avCodec::~avCodec()
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
avCodec::GetCodecInfo(media_codec_info *mci)
|
AVCodecDecoder::GetCodecInfo(media_codec_info *mci)
|
||||||
{
|
{
|
||||||
sprintf(mci->short_name, "ff:%s", fCodec->name);
|
sprintf(mci->short_name, "ff:%s", fCodec->name);
|
||||||
sprintf(mci->pretty_name, "%s (libavcodec %s)",
|
sprintf(mci->pretty_name, "%s (libavcodec %s)",
|
||||||
@@ -117,7 +118,7 @@ avCodec::GetCodecInfo(media_codec_info *mci)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
avCodec::Setup(media_format *ioEncodedFormat, const void *infoBuffer,
|
AVCodecDecoder::Setup(media_format *ioEncodedFormat, const void *infoBuffer,
|
||||||
size_t infoSize)
|
size_t infoSize)
|
||||||
{
|
{
|
||||||
if (ioEncodedFormat->type != B_MEDIA_ENCODED_AUDIO
|
if (ioEncodedFormat->type != B_MEDIA_ENCODED_AUDIO
|
||||||
@@ -125,7 +126,7 @@ avCodec::Setup(media_format *ioEncodedFormat, const void *infoBuffer,
|
|||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
isAudio = (ioEncodedFormat->type == B_MEDIA_ENCODED_AUDIO);
|
isAudio = (ioEncodedFormat->type == B_MEDIA_ENCODED_AUDIO);
|
||||||
TRACE("[%c] avCodec::Setup()\n", isAudio?('a'):('v'));
|
TRACE("[%c] AVCodecDecoder::Setup()\n", isAudio?('a'):('v'));
|
||||||
|
|
||||||
if (isAudio && !fOutputBuffer)
|
if (isAudio && !fOutputBuffer)
|
||||||
fOutputBuffer = new char[AVCODEC_MAX_AUDIO_FRAME_SIZE];
|
fOutputBuffer = new char[AVCODEC_MAX_AUDIO_FRAME_SIZE];
|
||||||
@@ -180,11 +181,11 @@ avCodec::Setup(media_format *ioEncodedFormat, const void *infoBuffer,
|
|||||||
&& gCodecTable[i].fourcc == cid) {
|
&& gCodecTable[i].fourcc == cid) {
|
||||||
fCodec = avcodec_find_decoder(gCodecTable[i].id);
|
fCodec = avcodec_find_decoder(gCodecTable[i].id);
|
||||||
if (!fCodec) {
|
if (!fCodec) {
|
||||||
TRACE("avCodec: unable to find the correct ffmpeg decoder "
|
TRACE("AVCodecDecoder: unable to find the correct ffmpeg decoder "
|
||||||
"(id = %d)!!!\n",gCodecTable[i].id);
|
"(id = %d)!!!\n",gCodecTable[i].id);
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
TRACE("avCodec: found decoder %s\n",fCodec->name);
|
TRACE("AVCodecDecoder: found decoder %s\n",fCodec->name);
|
||||||
|
|
||||||
if (gCodecTable[i].family == B_WAV_FORMAT_FAMILY && infoSize >= sizeof(wave_format_ex)) {
|
if (gCodecTable[i].family == B_WAV_FORMAT_FAMILY && infoSize >= sizeof(wave_format_ex)) {
|
||||||
const wave_format_ex *wfmt_data
|
const wave_format_ex *wfmt_data
|
||||||
@@ -200,7 +201,7 @@ avCodec::Setup(media_format *ioEncodedFormat, const void *infoBuffer,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fBlockAlign = ioEncodedFormat->u.encoded_audio.output.buffer_size;
|
fBlockAlign = ioEncodedFormat->u.encoded_audio.output.buffer_size;
|
||||||
TRACE("avCodec: extra data size %ld\n",infoSize);
|
TRACE("AVCodecDecoder: extra data size %ld\n",infoSize);
|
||||||
fExtraDataSize = infoSize;
|
fExtraDataSize = infoSize;
|
||||||
if (fExtraDataSize) {
|
if (fExtraDataSize) {
|
||||||
fExtraData = new char [fExtraDataSize];
|
fExtraData = new char [fExtraDataSize];
|
||||||
@@ -213,13 +214,13 @@ avCodec::Setup(media_format *ioEncodedFormat, const void *infoBuffer,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("avCodec::Setup failed!\n");
|
printf("AVCodecDecoder::Setup failed!\n");
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
avCodec::Seek(uint32 seekTo,
|
AVCodecDecoder::Seek(uint32 seekTo,
|
||||||
int64 seekFrame, int64 *frame,
|
int64 seekFrame, int64 *frame,
|
||||||
bigtime_t seekTime, bigtime_t *time)
|
bigtime_t seekTime, bigtime_t *time)
|
||||||
{
|
{
|
||||||
@@ -232,13 +233,13 @@ avCodec::Seek(uint32 seekTo,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (seekTo == B_MEDIA_SEEK_TO_TIME) {
|
if (seekTo == B_MEDIA_SEEK_TO_TIME) {
|
||||||
TRACE("avCodec::Seek by time ");
|
TRACE("AVCodecDecoder::Seek by time ");
|
||||||
TRACE("from frame %Ld and time %.6f TO Required Time %.6f. ", fFrame, fStartTime / 1000000.0, seekTime / 1000000.0);
|
TRACE("from frame %Ld and time %.6f TO Required Time %.6f. ", fFrame, fStartTime / 1000000.0, seekTime / 1000000.0);
|
||||||
|
|
||||||
*frame = (int64)(seekTime * fOutputFrameRate / 1000000LL);
|
*frame = (int64)(seekTime * fOutputFrameRate / 1000000LL);
|
||||||
*time = seekTime;
|
*time = seekTime;
|
||||||
} else if (seekTo == B_MEDIA_SEEK_TO_FRAME) {
|
} else if (seekTo == B_MEDIA_SEEK_TO_FRAME) {
|
||||||
TRACE("avCodec::Seek by Frame ");
|
TRACE("AVCodecDecoder::Seek by Frame ");
|
||||||
TRACE("from time %.6f and frame %Ld TO Required Frame %Ld. ", fStartTime / 1000000.0, fFrame, seekFrame);
|
TRACE("from time %.6f and frame %Ld TO Required Frame %Ld. ", fStartTime / 1000000.0, fFrame, seekFrame);
|
||||||
|
|
||||||
*time = (bigtime_t)(seekFrame * 1000000LL / fOutputFrameRate);
|
*time = (bigtime_t)(seekFrame * 1000000LL / fOutputFrameRate);
|
||||||
@@ -254,9 +255,9 @@ avCodec::Seek(uint32 seekTo,
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
avCodec::NegotiateOutputFormat(media_format *inout_format)
|
AVCodecDecoder::NegotiateOutputFormat(media_format *inout_format)
|
||||||
{
|
{
|
||||||
TRACE("[%c] avCodec::NegotiateOutputFormat()\n", isAudio?('a'):('v'));
|
TRACE("[%c] AVCodecDecoder::NegotiateOutputFormat()\n", isAudio?('a'):('v'));
|
||||||
|
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
@@ -413,7 +414,7 @@ avCodec::NegotiateOutputFormat(media_format *inout_format)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
avCodec::Decode(void *out_buffer, int64 *out_frameCount,
|
AVCodecDecoder::Decode(void *out_buffer, int64 *out_frameCount,
|
||||||
media_header *mh, media_decode_info *info)
|
media_header *mh, media_decode_info *info)
|
||||||
{
|
{
|
||||||
const void *data;
|
const void *data;
|
||||||
@@ -429,7 +430,7 @@ avCodec::Decode(void *out_buffer, int64 *out_frameCount,
|
|||||||
set_thread_priority(find_thread(NULL), B_NORMAL_PRIORITY);
|
set_thread_priority(find_thread(NULL), B_NORMAL_PRIORITY);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TRACE("[%c] avCodec::Decode() for time %Ld\n", isAudio?('a'):('v'), fStartTime);
|
// TRACE("[%c] AVCodecDecoder::Decode() for time %Ld\n", isAudio?('a'):('v'), fStartTime);
|
||||||
|
|
||||||
mh->start_time = fStartTime;
|
mh->start_time = fStartTime;
|
||||||
|
|
||||||
@@ -518,7 +519,7 @@ avCodec::Decode(void *out_buffer, int64 *out_frameCount,
|
|||||||
|
|
||||||
err = GetNextChunk(&data, &size, &chunk_mh);
|
err = GetNextChunk(&data, &size, &chunk_mh);
|
||||||
if (err != B_OK) {
|
if (err != B_OK) {
|
||||||
TRACE("avCodec::Decode(): error 0x%08lx from GetNextChunk()\n", err);
|
TRACE("AVCodecDecoder::Decode(): error 0x%08lx from GetNextChunk()\n", err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -559,7 +560,7 @@ avCodec::Decode(void *out_buffer, int64 *out_frameCount,
|
|||||||
// (int)(ffpicture->pts % 1000000), ffc->frame_number, ffc->frame_rate);
|
// (int)(ffpicture->pts % 1000000), ffc->frame_number, ffc->frame_rate);
|
||||||
|
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
printf("[%c] avCodec: error in decoding frame %lld\n",
|
printf("[%c] AVCodecDecoder: error in decoding frame %lld\n",
|
||||||
isAudio?('a'):('v'), *out_frameCount);
|
isAudio?('a'):('v'), *out_frameCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -614,64 +615,3 @@ avCodec::Decode(void *out_buffer, int64 *out_frameCount,
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t
|
|
||||||
avCodecPlugin::GetSupportedFormats(media_format ** formats, size_t * count)
|
|
||||||
{
|
|
||||||
BMediaFormats mediaFormats;
|
|
||||||
if (B_OK != mediaFormats.InitCheck())
|
|
||||||
return B_ERROR;
|
|
||||||
|
|
||||||
for (int i = 0; i < num_codecs; i++) {
|
|
||||||
media_format_description description;
|
|
||||||
description.family = gCodecTable[i].family;
|
|
||||||
switch(description.family) {
|
|
||||||
case B_WAV_FORMAT_FAMILY:
|
|
||||||
description.u.wav.codec = gCodecTable[i].fourcc;
|
|
||||||
break;
|
|
||||||
case B_AIFF_FORMAT_FAMILY:
|
|
||||||
description.u.aiff.codec = gCodecTable[i].fourcc;
|
|
||||||
break;
|
|
||||||
case B_AVI_FORMAT_FAMILY:
|
|
||||||
description.u.avi.codec = gCodecTable[i].fourcc;
|
|
||||||
break;
|
|
||||||
case B_MPEG_FORMAT_FAMILY:
|
|
||||||
description.u.mpeg.id = gCodecTable[i].fourcc;
|
|
||||||
break;
|
|
||||||
case B_QUICKTIME_FORMAT_FAMILY:
|
|
||||||
description.u.quicktime.codec = gCodecTable[i].fourcc;
|
|
||||||
break;
|
|
||||||
case B_MISC_FORMAT_FAMILY:
|
|
||||||
description.u.misc.file_format =
|
|
||||||
(uint32)(gCodecTable[i].fourcc >> 32);
|
|
||||||
description.u.misc.codec = (uint32) gCodecTable[i].fourcc;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
media_format format;
|
|
||||||
format.type = gCodecTable[i].type;
|
|
||||||
format.require_flags = 0;
|
|
||||||
format.deny_flags = B_MEDIA_MAUI_UNDEFINED_FLAGS;
|
|
||||||
if (B_OK != mediaFormats.MakeFormatFor(&description, 1, &format))
|
|
||||||
return B_ERROR;
|
|
||||||
avcodec_formats[i] = format;
|
|
||||||
}
|
|
||||||
|
|
||||||
*formats = avcodec_formats;
|
|
||||||
*count = num_codecs;
|
|
||||||
return B_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Decoder *
|
|
||||||
avCodecPlugin::NewDecoder(uint index)
|
|
||||||
{
|
|
||||||
return new avCodec();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MediaPlugin *instantiate_plugin()
|
|
||||||
{
|
|
||||||
return new avCodecPlugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
+16
-36
@@ -1,42 +1,30 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2001 Carlos Hasan. All Rights Reserved.
|
* Copyright (C) 2001 Carlos Hasan.
|
||||||
* Copyright (C) 2001 François Revol. All Rights Reserved.
|
* Copyright (C) 2001 François Revol.
|
||||||
* Copyright (C) 2001 Axel Dörfler. All Rights Reserved.
|
* Copyright (C) 2001 Axel Dörfler.
|
||||||
* Copyright (C) 2004 Marcus Overhagen. All Rights Reserved.
|
* Copyright (C) 2004 Marcus Overhagen.
|
||||||
|
* Copyright (C) 2009 Stephan Aßmus <superstippi@gmx.de>.
|
||||||
*
|
*
|
||||||
* Distributed under the terms of the MIT License.
|
* All rights reserved. Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
#ifndef AVCODEC_DECODER_H
|
||||||
|
#define AVCODEC_DECODER_H
|
||||||
|
|
||||||
//! libavcodec based decoder for Haiku
|
//! libavcodec based decoder for Haiku
|
||||||
|
|
||||||
#ifndef __AVCODEC_PLUGIN_H__
|
|
||||||
#define __AVCODEC_PLUGIN_H__
|
|
||||||
|
|
||||||
#include <MediaFormats.h>
|
#include <MediaFormats.h>
|
||||||
#include "ReaderPlugin.h"
|
|
||||||
#include "DecoderPlugin.h"
|
#include "DecoderPlugin.h"
|
||||||
|
#include "ReaderPlugin.h"
|
||||||
|
|
||||||
//#define DO_PROFILING
|
#include "CodecTable.h"
|
||||||
|
|
||||||
#include "gfx_util.h"
|
|
||||||
|
|
||||||
struct codec_table {
|
class AVCodecDecoder : public Decoder {
|
||||||
CodecID id;
|
|
||||||
media_type type;
|
|
||||||
media_format_family family;
|
|
||||||
uint64 fourcc;
|
|
||||||
const char* prettyname;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern const struct codec_table gCodecTable[];
|
|
||||||
extern const int num_codecs;
|
|
||||||
extern media_format avcodec_formats[];
|
|
||||||
|
|
||||||
class avCodec : public Decoder {
|
|
||||||
public:
|
public:
|
||||||
avCodec();
|
AVCodecDecoder();
|
||||||
|
|
||||||
virtual ~avCodec();
|
virtual ~AVCodecDecoder();
|
||||||
|
|
||||||
virtual void GetCodecInfo(media_codec_info* mci);
|
virtual void GetCodecInfo(media_codec_info* mci);
|
||||||
|
|
||||||
@@ -59,7 +47,7 @@ protected:
|
|||||||
media_header fHeader;
|
media_header fHeader;
|
||||||
media_decode_info fInfo;
|
media_decode_info fInfo;
|
||||||
|
|
||||||
friend class avCodecInputStream;
|
// friend class avCodecInputStream;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
media_format fInputFormat;
|
media_format fInputFormat;
|
||||||
@@ -100,12 +88,4 @@ private:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class avCodecPlugin : public DecoderPlugin {
|
#endif // AVCODEC_DECODER_H
|
||||||
public:
|
|
||||||
Decoder* NewDecoder(uint index);
|
|
||||||
status_t GetSupportedFormats(media_format** formats,
|
|
||||||
size_t* count);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -87,14 +87,6 @@ static URLProtocol position_io_protocol = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
avcodec_register_all()
|
|
||||||
{
|
|
||||||
// av_register_all() will call libavcodec's avcodec_register_all(),
|
|
||||||
// but we do not link against libavcodec in this plugin.
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
init_libavformat()
|
init_libavformat()
|
||||||
{
|
{
|
||||||
@@ -103,9 +95,6 @@ init_libavformat()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int dummy = init_libavformat();
|
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark - AVFormatReader
|
// #pragma mark - AVFormatReader
|
||||||
|
|
||||||
|
|
||||||
@@ -218,18 +207,3 @@ AVFormatReader::GetNextChunk(void* _cookie, const void** chunkBuffer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
|
||||||
|
|
||||||
|
|
||||||
Reader*
|
|
||||||
AVFormatPlugin::NewReader()
|
|
||||||
{
|
|
||||||
return new(std::nothrow) AVFormatReader;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MediaPlugin*
|
|
||||||
instantiate_plugin()
|
|
||||||
{
|
|
||||||
return new(std::nothrow) AVFormatPlugin;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -46,11 +46,4 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class AVFormatPlugin : public ReaderPlugin {
|
|
||||||
public:
|
|
||||||
Reader* NewReader();
|
|
||||||
};
|
|
||||||
|
|
||||||
MediaPlugin *instantiate_plugin();
|
|
||||||
|
|
||||||
#endif // AV_FORMAT_READER_H
|
#endif // AV_FORMAT_READER_H
|
||||||
|
|||||||
+10
-21
@@ -1,23 +1,12 @@
|
|||||||
/******************************************************************************
|
/*
|
||||||
/
|
* Copyright (C) 2001 Carlos Hasan. All Rights Reserved.
|
||||||
/ File: codectbl.cpp
|
* Copyright (C) 2001 François Revol. All Rights Reserved.
|
||||||
/
|
* Copyright (C) 2001 Axel Dörfler. All Rights Reserved.
|
||||||
/ Description: FFMpeg Generic Decoder for BeOS Release 5.
|
*
|
||||||
/
|
* Distributed under the terms of the MIT License.
|
||||||
/ Disclaimer: This decoder is based on undocumented APIs.
|
*/
|
||||||
/ Therefore it is likely, if not certain, to break in future
|
|
||||||
/ versions of BeOS. This piece of software is in no way
|
|
||||||
/ connected to or even supported by Be, Inc.
|
|
||||||
/
|
|
||||||
/ Copyright (C) 2001 François Revol. All Rights Reserved.
|
|
||||||
/ Some code from MPEG I Decoder from Carlos Hasan.
|
|
||||||
/ Had some help from Axeld
|
|
||||||
/
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
#include <MediaDefs.h>
|
#include "CodecTable.h"
|
||||||
|
|
||||||
#include "avcodecplugin.h"
|
|
||||||
|
|
||||||
#define HAS_WMA_AUDIO
|
#define HAS_WMA_AUDIO
|
||||||
//#define HAS_MACE_AUDIO
|
//#define HAS_MACE_AUDIO
|
||||||
@@ -214,8 +203,8 @@ const struct codec_table gCodecTable[] = {
|
|||||||
{CODEC_ID_NONE, B_MEDIA_UNKNOWN_TYPE, B_ANY_FORMAT_FAMILY, 0, "null codec !!!"}
|
{CODEC_ID_NONE, B_MEDIA_UNKNOWN_TYPE, B_ANY_FORMAT_FAMILY, 0, "null codec !!!"}
|
||||||
};
|
};
|
||||||
|
|
||||||
const int num_codecs = (sizeof(gCodecTable) / sizeof(codec_table) - 1);
|
const int gCodecCount = (sizeof(gCodecTable) / sizeof(codec_table) - 1);
|
||||||
|
|
||||||
|
|
||||||
media_format avcodec_formats[sizeof(gCodecTable)];
|
media_format gAVCodecFormats[sizeof(gCodecTable)];
|
||||||
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2001 Carlos Hasan. All Rights Reserved.
|
||||||
|
* Copyright (C) 2001 François Revol. All Rights Reserved.
|
||||||
|
* Copyright (C) 2001 Axel Dörfler. All Rights Reserved.
|
||||||
|
* Copyright (C) 2004 Marcus Overhagen. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//! libavcodec based decoder for Haiku
|
||||||
|
|
||||||
|
#ifndef CODEC_TABLE_H
|
||||||
|
#define CODEC_TABLE_H
|
||||||
|
|
||||||
|
#include <MediaDefs.h>
|
||||||
|
#include <MediaFormats.h>
|
||||||
|
|
||||||
|
#include "gfx_util.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct codec_table {
|
||||||
|
CodecID id;
|
||||||
|
media_type type;
|
||||||
|
media_format_family family;
|
||||||
|
uint64 fourcc;
|
||||||
|
const char* prettyname;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const struct codec_table gCodecTable[];
|
||||||
|
extern const int gCodecCount;
|
||||||
|
extern media_format gAVCodecFormats[];
|
||||||
|
|
||||||
|
|
||||||
|
#endif // CODEC_TABLE_H
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2001 Carlos Hasan
|
||||||
|
* Copyright (C) 2001 François Revol
|
||||||
|
* Copyright (C) 2001 Axel Dörfler
|
||||||
|
* Copyright (C) 2004 Marcus Overhagen
|
||||||
|
* Copyright (C) 2009 Stephan Aßmus <[email protected]>
|
||||||
|
*
|
||||||
|
* All rights reserved. Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//! libavcodec/libavformat based Decoder and Reader plugin for Haiku
|
||||||
|
|
||||||
|
#include "FFmpegPlugin.h"
|
||||||
|
|
||||||
|
#include <new>
|
||||||
|
|
||||||
|
#include "AVCodecDecoder.h"
|
||||||
|
#include "AVFormatReader.h"
|
||||||
|
#include "CodecTable.h"
|
||||||
|
|
||||||
|
|
||||||
|
Decoder*
|
||||||
|
FFmpegPlugin::NewDecoder(uint index)
|
||||||
|
{
|
||||||
|
// TODO: Confirm we can check index here.
|
||||||
|
// if (index == 0)
|
||||||
|
return new(std::nothrow) AVCodecDecoder();
|
||||||
|
// return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reader*
|
||||||
|
FFmpegPlugin::NewReader()
|
||||||
|
{
|
||||||
|
return new(std::nothrow) AVFormatReader();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
FFmpegPlugin::GetSupportedFormats(media_format** formats, size_t* count)
|
||||||
|
{
|
||||||
|
BMediaFormats mediaFormats;
|
||||||
|
if (mediaFormats.InitCheck() != B_OK)
|
||||||
|
return B_ERROR;
|
||||||
|
|
||||||
|
for (int i = 0; i < gCodecCount; i++) {
|
||||||
|
media_format_description description;
|
||||||
|
description.family = gCodecTable[i].family;
|
||||||
|
switch(description.family) {
|
||||||
|
case B_WAV_FORMAT_FAMILY:
|
||||||
|
description.u.wav.codec = gCodecTable[i].fourcc;
|
||||||
|
break;
|
||||||
|
case B_AIFF_FORMAT_FAMILY:
|
||||||
|
description.u.aiff.codec = gCodecTable[i].fourcc;
|
||||||
|
break;
|
||||||
|
case B_AVI_FORMAT_FAMILY:
|
||||||
|
description.u.avi.codec = gCodecTable[i].fourcc;
|
||||||
|
break;
|
||||||
|
case B_MPEG_FORMAT_FAMILY:
|
||||||
|
description.u.mpeg.id = gCodecTable[i].fourcc;
|
||||||
|
break;
|
||||||
|
case B_QUICKTIME_FORMAT_FAMILY:
|
||||||
|
description.u.quicktime.codec = gCodecTable[i].fourcc;
|
||||||
|
break;
|
||||||
|
case B_MISC_FORMAT_FAMILY:
|
||||||
|
description.u.misc.file_format =
|
||||||
|
(uint32)(gCodecTable[i].fourcc >> 32);
|
||||||
|
description.u.misc.codec = (uint32) gCodecTable[i].fourcc;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
media_format format;
|
||||||
|
format.type = gCodecTable[i].type;
|
||||||
|
format.require_flags = 0;
|
||||||
|
format.deny_flags = B_MEDIA_MAUI_UNDEFINED_FLAGS;
|
||||||
|
if (mediaFormats.MakeFormatFor(&description, 1, &format) != B_OK)
|
||||||
|
return B_ERROR;
|
||||||
|
gAVCodecFormats[i] = format;
|
||||||
|
}
|
||||||
|
|
||||||
|
*formats = gAVCodecFormats;
|
||||||
|
*count = gCodecCount;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MediaPlugin*
|
||||||
|
instantiate_plugin()
|
||||||
|
{
|
||||||
|
return new(std::nothrow) FFmpegPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2001 Carlos Hasan. All Rights Reserved.
|
||||||
|
* Copyright (C) 2001 François Revol. All Rights Reserved.
|
||||||
|
* Copyright (C) 2001 Axel Dörfler. All Rights Reserved.
|
||||||
|
* Copyright (C) 2004 Marcus Overhagen. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//! libavcodec based decoder for Haiku
|
||||||
|
|
||||||
|
#ifndef FFMPEG_PLUGIN_H
|
||||||
|
#define FFMPEG_PLUGIN_H
|
||||||
|
|
||||||
|
#include <MediaFormats.h>
|
||||||
|
|
||||||
|
#include "DecoderPlugin.h"
|
||||||
|
#include "ReaderPlugin.h"
|
||||||
|
|
||||||
|
class FFmpegPlugin : public ReaderPlugin, public DecoderPlugin {
|
||||||
|
public:
|
||||||
|
virtual Reader* NewReader();
|
||||||
|
|
||||||
|
virtual Decoder* NewDecoder(uint index);
|
||||||
|
virtual status_t GetSupportedFormats(media_format** formats,
|
||||||
|
size_t* count);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // FFMPEG_PLUGIN_H
|
||||||
@@ -9,14 +9,19 @@ SubDirHdrs [ FDirName $(SUBDIR) libavformat ] ;
|
|||||||
SubDirHdrs [ FDirName $(SUBDIR) libavutil ] ;
|
SubDirHdrs [ FDirName $(SUBDIR) libavutil ] ;
|
||||||
SubDirHdrs [ FDirName $(SUBDIR) libswscale ] ;
|
SubDirHdrs [ FDirName $(SUBDIR) libswscale ] ;
|
||||||
|
|
||||||
Addon avcodec :
|
Addon ffmpeg :
|
||||||
avcodec.cpp
|
AVCodecDecoder.cpp
|
||||||
codectbl.cpp
|
AVFormatReader.cpp
|
||||||
|
CodecTable.cpp
|
||||||
|
|
||||||
|
FFmpegPlugin.cpp
|
||||||
|
|
||||||
gfx_conv_c.cpp
|
gfx_conv_c.cpp
|
||||||
gfx_conv_c_lookup.cpp
|
gfx_conv_c_lookup.cpp
|
||||||
# gfx_conv_mmx.cpp
|
# gfx_conv_mmx.cpp
|
||||||
gfx_util.cpp
|
gfx_util.cpp
|
||||||
:
|
:
|
||||||
|
libavformat.a
|
||||||
libavcodec.a
|
libavcodec.a
|
||||||
libavcodec_$(TARGET_ARCH).a
|
libavcodec_$(TARGET_ARCH).a
|
||||||
libavutil.a
|
libavutil.a
|
||||||
@@ -26,16 +31,6 @@ Addon avcodec :
|
|||||||
libz.a
|
libz.a
|
||||||
;
|
;
|
||||||
|
|
||||||
Addon avformat :
|
|
||||||
AVFormatReader.cpp
|
|
||||||
:
|
|
||||||
libavformat.a
|
|
||||||
libavutil.a
|
|
||||||
be
|
|
||||||
libmedia.so
|
|
||||||
libz.a
|
|
||||||
;
|
|
||||||
|
|
||||||
SubInclude HAIKU_TOP src add-ons media plugins avcodec libavcodec ;
|
SubInclude HAIKU_TOP src add-ons media plugins avcodec libavcodec ;
|
||||||
SubInclude HAIKU_TOP src add-ons media plugins avcodec libavformat ;
|
SubInclude HAIKU_TOP src add-ons media plugins avcodec libavformat ;
|
||||||
SubInclude HAIKU_TOP src add-ons media plugins avcodec libavutil ;
|
SubInclude HAIKU_TOP src add-ons media plugins avcodec libavutil ;
|
||||||
|
|||||||
Reference in New Issue
Block a user