Update avcodec to 20080825

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27568 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
David McPaul
2008-09-15 14:15:08 +00:00
parent c5e5c91ff1
commit 3cdff7414f
4 changed files with 40 additions and 16 deletions
@@ -5,6 +5,8 @@ SetSubDirSupportedPlatformsBeOSCompatible ;
UsePrivateHeaders media ; UsePrivateHeaders media ;
SubDirHdrs [ FDirName $(SUBDIR) libavcodec ] ; SubDirHdrs [ FDirName $(SUBDIR) libavcodec ] ;
SubDirHdrs [ FDirName $(SUBDIR) libavutil ] ;
SubDirHdrs [ FDirName $(SUBDIR) libswscale ] ;
Addon avcodec : Addon avcodec :
avcodec.cpp avcodec.cpp
@@ -15,8 +17,12 @@ Addon avcodec :
gfx_util.cpp gfx_util.cpp
: :
libavcodec.a libavcodec.a
libavutil.a
libswscale.a
be be
libmedia.so libmedia.so
; ;
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 libavutil ;
SubInclude HAIKU_TOP src add-ons media plugins avcodec libswscale ;
+28 -14
View File
@@ -13,18 +13,17 @@
#include <OS.h> #include <OS.h>
#include <Bitmap.h> #include <Bitmap.h>
#include <string.h> #include <string.h>
#include "avcodec.h" #include "avcodec.h"
#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
# define TRACE(x...) # define TRACE(x...)
#endif #endif
struct wave_format_ex { struct wave_format_ex {
uint16 format_tag; uint16 format_tag;
uint16 channels; uint16 channels;
@@ -57,7 +56,7 @@ avCodec::avCodec()
fBlockAlign(0), fBlockAlign(0),
fOutputBuffer(0) fOutputBuffer(0)
{ {
TRACE("[%c] avCodec::avCodec()\n", isAudio?('a'):('v')); TRACE("avCodec::avCodec()\n");
// prevent multiple inits // prevent multiple inits
static volatile vint32 ff_init_count = 0; static volatile vint32 ff_init_count = 0;
@@ -113,6 +112,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'));
if (isAudio && !fOutputBuffer) if (isAudio && !fOutputBuffer)
fOutputBuffer = new char[100000]; fOutputBuffer = new char[100000];
@@ -185,6 +185,13 @@ avCodec::Setup(media_format *ioEncodedFormat, const void *infoBuffer,
memcpy(fExtraData, wfmt_data + 1, fExtraDataSize); memcpy(fExtraData, wfmt_data + 1, fExtraDataSize);
} }
} }
} else {
TRACE("avCodec: extra data size %ld\n",infoSize);
fExtraDataSize = infoSize;
if (fExtraDataSize) {
fExtraData = new char [fExtraDataSize];
memcpy(fExtraData, infoBuffer, fExtraDataSize);
}
} }
fInputFormat = *ioEncodedFormat; fInputFormat = *ioEncodedFormat;
@@ -216,8 +223,10 @@ avCodec::Seek(uint32 in_towhat,int64 in_requiredFrame, int64 *inout_frame,
status_t status_t
avCodec::NegotiateOutputFormat(media_format *inout_format) avCodec::NegotiateOutputFormat(media_format *inout_format)
{ {
TRACE("[%c] avCodec::Format()\n", isAudio?('a'):('v')); TRACE("[%c] avCodec::NegotiateOutputFormat()\n", isAudio?('a'):('v'));
int result;
#if DEBUG #if DEBUG
char buffer[1024]; char buffer[1024];
string_for_format(*inout_format, buffer, sizeof(buffer)); string_for_format(*inout_format, buffer, sizeof(buffer));
@@ -242,7 +251,7 @@ avCodec::NegotiateOutputFormat(media_format *inout_format)
ffc->sample_rate = (int) fInputFormat.u.encoded_audio.output.frame_rate; ffc->sample_rate = (int) fInputFormat.u.encoded_audio.output.frame_rate;
ffc->channels = fInputFormat.u.encoded_audio.output.channel_count; ffc->channels = fInputFormat.u.encoded_audio.output.channel_count;
ffc->block_align = fBlockAlign; ffc->block_align = fBlockAlign;
ffc->extradata = fExtraData; ffc->extradata = (uint8_t *)fExtraData;
ffc->extradata_size = fExtraDataSize; ffc->extradata_size = fExtraDataSize;
TRACE("bit_rate %d, sample_rate %d, channels %d, block_align %d, " TRACE("bit_rate %d, sample_rate %d, channels %d, block_align %d, "
@@ -256,11 +265,11 @@ avCodec::NegotiateOutputFormat(media_format *inout_format)
} }
// open new // open new
if (avcodec_open(ffc, fCodec) >= 0) result = avcodec_open(ffc, fCodec);
fCodecInitDone = true; fCodecInitDone = (result >= 0);
TRACE("audio: bit_rate = %d, sample_rate = %d, chans = %d\n", TRACE("audio: bit_rate = %d, sample_rate = %d, chans = %d Init = %d\n",
ffc->bit_rate, ffc->sample_rate, ffc->channels); ffc->bit_rate, ffc->sample_rate, ffc->channels, result);
fStartTime = 0; fStartTime = 0;
fOutputFrameSize = 2 * outputAudioFormat.channel_count; fOutputFrameSize = 2 * outputAudioFormat.channel_count;
@@ -275,7 +284,12 @@ avCodec::NegotiateOutputFormat(media_format *inout_format)
inout_format->require_flags = 0; inout_format->require_flags = 0;
inout_format->deny_flags = B_MEDIA_MAUI_UNDEFINED_FLAGS; inout_format->deny_flags = B_MEDIA_MAUI_UNDEFINED_FLAGS;
return fCodecInitDone ? B_OK : B_ERROR; if (!fCodecInitDone) {
TRACE("avcodec_open() failed!\n");
return B_ERROR;
}
return B_OK;
} else { // VIDEO } else { // VIDEO
@@ -283,11 +297,11 @@ avCodec::NegotiateOutputFormat(media_format *inout_format)
ffc->width = fOutputVideoFormat.display.line_width; ffc->width = fOutputVideoFormat.display.line_width;
ffc->height = fOutputVideoFormat.display.line_count; ffc->height = fOutputVideoFormat.display.line_count;
ffc->frame_rate = (int)(fOutputVideoFormat.field_rate // ffc->frame_rate = (int)(fOutputVideoFormat.field_rate
* ffc->frame_rate_base); // * ffc->frame_rate_base);
if (fInputFormat.MetaDataSize() > 0) { if (fInputFormat.MetaDataSize() > 0) {
ffc->extradata = (void *)fInputFormat.MetaData(); ffc->extradata = (uint8_t *)fInputFormat.MetaData();
ffc->extradata_size = fInputFormat.MetaDataSize(); ffc->extradata_size = fInputFormat.MetaDataSize();
} }
@@ -53,6 +53,8 @@ const struct codec_table gCodecTable[] = {
{CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'mp4v', "MPEG4 Video"}, {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'mp4v', "MPEG4 Video"},
{CODEC_ID_MPEG4AAC, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 'a4pm', "MPEG4 AAC"}, {CODEC_ID_MPEG4AAC, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 'a4pm', "MPEG4 AAC"},
{CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'v4pm', "MPEG4 Video"}, {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'v4pm', "MPEG4 Video"},
{CODEC_ID_MPEG4AAC, B_MEDIA_ENCODED_AUDIO, B_MISC_FORMAT_FAMILY, 'mp4a', "MPEG4 AAC"}, /* For matroska */
{CODEC_ID_MPEG4AAC, B_MEDIA_ENCODED_AUDIO, B_MISC_FORMAT_FAMILY, 'a4pm', "MPEG4 AAC"}, /* For matroska */
#ifdef HAS_MACE_AUDIO #ifdef HAS_MACE_AUDIO
{CODEC_ID_MACE3, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 'MAC3', "MACE 3:1"}, {CODEC_ID_MACE3, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 'MAC3', "MACE 3:1"},
+4 -2
View File
@@ -1,6 +1,6 @@
/****************************************************************************** /******************************************************************************
/ /
/ File: ffutils.h / File: gfx_util.h
/ /
/ Description: utility functions for ffmpeg codec wrappers for BeOs R5. / Description: utility functions for ffmpeg codec wrappers for BeOs R5.
/ /
@@ -18,7 +18,9 @@
// BeOS and libavcodec bitmap formats // BeOS and libavcodec bitmap formats
#include <GraphicsDefs.h> #include <GraphicsDefs.h>
#include "libavcodec/avcodec.h" extern "C" {
#include "libavcodec/avcodec.h"
}
// this function will be used by the wrapper to write into // this function will be used by the wrapper to write into
// the Media Kit provided buffer from the self-allocated ffmpeg codec buffer // the Media Kit provided buffer from the self-allocated ffmpeg codec buffer