本文整理汇总了C++中BMediaTrack类的典型用法代码示例。如果您正苦于以下问题:C++ BMediaTrack类的具体用法?C++ BMediaTrack怎么用?C++ BMediaTrack使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了BMediaTrack类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: get_ref_for_path
/* isAudioDisc
* checks if selected files are audio files, and greps the playtime of them
* when all files audio files
* returns true if audio disc
*/
bool
ProjectTypeSelector::isAudioDisc()
{
BString *FileType;
for(int i = 0; i < TypeList->CountItems(); i++) {
FileType = (BString*)TypeList->ItemAt(i);
if(FileType->Compare("audio", 5) != 0)
return false;
}
entry_ref ref;
BMediaFile *mediaFile;
bigtime_t time = 0;
for(int i = 0; i < FileList->CountItems(); i++){
get_ref_for_path(((BString*)FileList->ItemAt(i))->String(), &ref);
mediaFile = new BMediaFile(&ref);
BMediaTrack *track = NULL;
for(int j = 0; j < mediaFile->CountTracks(); j++){
track = mediaFile->TrackAt(j);
time = track->Duration();
intPlayTime += ((int)time / 1000000);
}
delete mediaFile;
}
return true;
}
示例2: main
int
main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "Usage:\n %s <filename>\n", argv[0]);
return 1;
}
entry_ref ref;
if (get_ref_for_path(argv[1], &ref)!=B_OK)
return 2;
BMediaFile *playFile = new BMediaFile(&ref);
if (playFile->InitCheck()<B_OK) {
delete playFile;
return 2;
}
for (int ix=0; ix<playFile->CountTracks(); ix++) {
BMediaTrack * track = playFile->TrackAt(ix);
playFormat.type = B_MEDIA_RAW_AUDIO;
if ((track->DecodedFormat(&playFormat) == B_OK)
&& (playFormat.type == B_MEDIA_RAW_AUDIO)) {
playTrack = track;
break;
}
if (track)
playFile->ReleaseTrack(track);
}
// Good relations with the Wookiees, I have.
signal(SIGINT, keyb_int);
new BApplication("application/x-vnd.Antares-playfile");
finished = create_sem(0, "finish wait");
printf("playing file...\n");
// Execute Plan 66!
sp = new BSoundPlayer(&playFormat.u.raw_audio, "playfile", play_buffer);
sp->SetVolume(1.0f);
// Join me, Padmé and together we can rule this galaxy.
sp->SetHasData(true);
sp->Start();
acquire_sem(finished);
if (interrupt) {
// Once more, the Sith will rule the galaxy.
printf("interrupted\n");
sp->Stop();
kill_thread(reader);
}
printf("playback finished\n");
delete sp;
delete playFile;
}
示例3: TrackIndex
AudioTrack*
TrackIO::ImportAudio(BMediaFile* mediaFile, const char* name)
{
TrackIndex* index = new TrackIndex();
media_format format;
MediaFormatBuilder::BuildAudioBlockRawFormat(&format);
// TODO check original file format to ask
// if the user want it to be resampled or not.
// NOTE atm we are considering only the first track, may and probably will
// change in future, or at least the user should be able to select which track
// to import (eventually all and as separated track).
BMediaTrack* track = mediaFile->TrackAt(0);
if (track->DecodedFormat(&format) != B_OK) {
// Critical error show a popup
return NULL;
}
uint32 channels = format.u.raw_audio.channel_count;
for (uint32 i = 0; i < channels; i++) {
MediaBlockMap* channel = new MediaBlockMap();
index->AddChannel(channel);
}
WindowsManager::ProgressUpdate(10.0f, "Loading audio data");
int64 frames = 0;
int64 bufferFrames = (format.u.raw_audio.buffer_size
/ (format.u.raw_audio.format
& media_raw_audio_format::B_AUDIO_SIZE_MASK));
float buffer[bufferFrames];
memset(&buffer, 0, format.u.raw_audio.buffer_size);
while (track->ReadFrames(buffer, &frames) == B_OK) {
_BuildBlocks((float*)buffer, frames*channels, index,
channels);
memset(&buffer, 0, format.u.raw_audio.buffer_size);
}
WindowsManager::ProgressUpdate(50.0f, "Flushing data and preview");
mediaFile->ReleaseTrack(track);
// This is done to optimize writes, the data is cached in a buffer
// and then written to the BPositionIO.
for (uint32 j = 0; j < index->CountChannels(); j++)
index->ChannelAt(j)->Writer()->Flush();
return new AudioTrack(name, index);
}
示例4: Video
/* FUNCTION: Video :: Video
ARGUMENTS: ref
RETURN: n/a
DESCRIPTION: Constructor
*/
Video :: Video(entry_ref *ref)
{
fMediaFile = 0;
fVideoTrack = 0;
fBitmap = 0;
fVideoThread = 0;
fMediaFile = new BMediaFile(ref, B_MEDIA_FILE_BIG_BUFFERS);
fStatus = fMediaFile->InitCheck();
if (fStatus != B_OK)
return;
int32 num_tracks = fMediaFile->CountTracks();
for (int32 i=0; i < num_tracks; i++)
{
BMediaTrack *track = fMediaFile->TrackAt(i);
if (track == NULL)
{
fMediaFile->ReleaseAllTracks();
printf("Media file claims to have %ld tracks, cannot find track %ld\n", num_tracks, i);
fVideoTrack = 0;
return;
}
media_format mf;
fStatus = track->EncodedFormat(&mf);
if (fStatus == B_OK)
{
switch (mf.type)
{
case B_MEDIA_ENCODED_VIDEO:
case B_MEDIA_RAW_VIDEO:
if (fVideoTrack == 0)
{
fVideoTrack = track;
InitPlayer(&mf);
}
else
printf("Multiple video tracks not supported\n");
break;
default:
fStatus = B_ERROR;
}
}
if (fStatus != B_OK)
fMediaFile->ReleaseTrack(track);
}
if (fVideoTrack)
fStatus = B_OK;
}
示例5: fName
MediaFilePlayer::MediaFilePlayer(const char* media_type,
const char* media_name, entry_ref* ref)
:
fName(media_name),
fInitCheck(B_ERROR),
fRef(*ref),
fSoundPlayer(NULL),
fPlayTrack(NULL)
{
fPlayFile = new BMediaFile(&fRef);
fInitCheck = fPlayFile->InitCheck();
if (fInitCheck != B_OK)
return;
memset(&fPlayFormat, 0, sizeof(fPlayFormat));
for (int i=0; i < fPlayFile->CountTracks(); i++) {
BMediaTrack* track = fPlayFile->TrackAt(i);
if (track == NULL)
continue;
fPlayFormat.type = B_MEDIA_RAW_AUDIO;
fPlayFormat.u.raw_audio.buffer_size = 256;
if ((track->DecodedFormat(&fPlayFormat) == B_OK)
&& (fPlayFormat.type == B_MEDIA_RAW_AUDIO)) {
fPlayTrack = track;
break;
}
fPlayFile->ReleaseTrack(track);
}
if (fPlayTrack == NULL) {
fInitCheck = B_BAD_VALUE;
return;
}
fSoundPlayer = new BSoundPlayer(&fPlayFormat.u.raw_audio,
media_name, PlayFunction, NULL, this);
fInitCheck = fSoundPlayer->InitCheck();
if (fInitCheck != B_OK)
return;
fSoundPlayer->SetVolume(1.0f);
fSoundPlayer->SetHasData(true);
fSoundPlayer->Start();
}
示例6: TRACE
AudioProducer::~AudioProducer()
{
TRACE("%p->AudioProducer::~AudioProducer()\n", this);
#if DEBUG_TO_FILE
BMediaTrack* track;
if (BMediaFile* file = init_media_file(fPreferredFormat, &track)) {
printf("deleting file...\n");
track->Flush();
file->ReleaseTrack(track);
file->CloseFile();
delete file;
}
#endif // DEBUG_TO_FILE
// Stop the BMediaEventLooper thread
Quit();
TRACE("AudioProducer::~AudioProducer() done\n");
}
示例7: audioDone
void
MediaFileInfoView::_GetFileInfo(BString* audioFormat, BString* videoFormat,
BString* audioDetails, BString* videoDetails, BString* duration)
{
fDuration = 0;
if (fMediaFile == NULL)
return;
BMediaTrack* track;
media_format format;
memset(&format, 0, sizeof(format));
media_codec_info codecInfo;
bool audioDone(false), videoDone(false);
bigtime_t audioDuration = 0;
bigtime_t videoDuration = 0;
int32 tracks = fMediaFile->CountTracks();
int64 videoFrames = 0;
int64 audioFrames = 0;
for (int32 i = 0; i < tracks && (!audioDone || !videoDone); i++) {
track = fMediaFile->TrackAt(i);
if (track != NULL) {
track->EncodedFormat(&format);
if (format.IsVideo()) {
memset(&format, 0, sizeof(format));
format.type = B_MEDIA_RAW_VIDEO;
track->DecodedFormat(&format);
media_raw_video_format *rvf = &(format.u.raw_video);
track->GetCodecInfo(&codecInfo);
*videoFormat << codecInfo.pretty_name;
videoDuration = track->Duration();
videoFrames = track->CountFrames();
*videoDetails << (int32)format.Width() << "x" << (int32)format.Height()
<< " " << (int32)(rvf->field_rate / rvf->interlace)
<< " fps / " << videoFrames << " frames";
videoDone = true;
} else if (format.IsAudio()) {
memset(&format, 0, sizeof(format));
format.type = B_MEDIA_RAW_AUDIO;
track->DecodedFormat(&format);
media_raw_audio_format *raf = &(format.u.raw_audio);
char bytesPerSample = (char)(raf->format & 0xf);
if (bytesPerSample == 1) {
*audioDetails << "8 bit ";
} else if (bytesPerSample == 2) {
*audioDetails << "16 bit ";
} else {
*audioDetails << bytesPerSample << "byte ";
}
track->GetCodecInfo(&codecInfo);
*audioFormat << codecInfo.pretty_name;
audioDuration = track->Duration();
audioFrames = track->CountFrames();
*audioDetails << (float)(raf->frame_rate / 1000.0f) << " kHz";
if (raf->channel_count == 1) {
*audioDetails << " mono / ";
} else if (raf->channel_count == 2) {
*audioDetails << " stereo / ";
} else {
*audioDetails << (int32)raf->channel_count << " channel / " ;
}
*audioDetails << audioFrames << " frames";
audioDone = true;
}
fMediaFile->ReleaseTrack(track);
}
}
fDuration = MAX(audioDuration, videoDuration);
*duration << (int32)(fDuration / 1000000)
<< " seconds";
}
示例8: BMediaFile
// Init
status_t
VideoClip::Init(const entry_ref* ref)
{
// check if this file is a MediaFile
// instantiate a BMediaFile object, and make sure there was no error.
fMediaFile = new BMediaFile(ref);
status_t err = fMediaFile->InitCheck();
if (err < B_OK) {
fprintf(stderr, "VideoClip::Init() - "
"no media file: %s\n", strerror(err));
return err;
}
// count the tracks and instanciate them, one at a time
int32 numTracks = fMediaFile->CountTracks();
for (int32 i = 0; i < numTracks; i++) {
if (fTrack)
break;
BMediaTrack* track = fMediaFile->TrackAt(i);
if (!track) {
fprintf(stderr, "VideoClip::Init() - "
"cannot read media track at %ld\n", i);
continue;
}
// get the encoded format
media_format format;
err = track->EncodedFormat(&format);
if (err < B_OK) {
fprintf(stderr, "VideoClip::Init() - "
"cannot understand encoded format "
"of track %ld: %s\n", i, strerror(err));
continue;
}
switch(format.type) {
case B_MEDIA_RAW_VIDEO:
case B_MEDIA_ENCODED_VIDEO: {
// video track
fTrack = track;
break;
}
case B_MEDIA_RAW_AUDIO:
// audio track
break;
case B_MEDIA_ENCODED_AUDIO:
// audio track
break;
default:
break;
}
if (fTrack != track) {
// didn't do anything with the track
fMediaFile->ReleaseTrack(track);
}
}
if (!fTrack)
return B_UNSUPPORTED;
err = fTrack->EncodedFormat(&fFormat);
if (err < B_OK) {
fprintf(stderr, "VideoClip::Init() - "
"fTrack->EncodedFormat(): %s\n",
strerror(err));
return err;
}
// get encoded video frame size
uint32 width = fFormat.u.encoded_video.output.display.line_width;
uint32 height = fFormat.u.encoded_video.output.display.line_count;
printf("VideoClip::Init() - native colorspace: %s\n",
string_for_color_space(fFormat.u.encoded_video.output.display.format));
// allocate a buffer large enough to contain the decoded frame.
BRect videoBounds(0.0, 0.0, width - 1, height - 1);
fBuffer = new BBitmap(videoBounds, 0, B_YCbCr422);
err = fBuffer->InitCheck();
if (err < B_OK) {
fprintf(stderr, "VideoClip::Init() - "
"error allocating buffer: %s\n",
strerror(err));
delete fBuffer;
fBuffer = NULL;
return err;
}
// specifiy the decoded format. we derive this information from
// the encoded format.
memset(&fFormat, 0, sizeof(media_format));
fFormat.u.raw_video.last_active = height - 1;
// fFormat.u.raw_video.orientation = B_VIDEO_TOP_LEFT_RIGHT;
// fFormat.u.raw_video.pixel_width_aspect = 1;
// fFormat.u.raw_video.pixel_height_aspect = 1;
fFormat.u.raw_video.display.format = fBuffer->ColorSpace();
fFormat.u.raw_video.display.line_width = width;
fFormat.u.raw_video.display.line_count = height;
fFormat.u.raw_video.display.bytes_per_row = fBuffer->BytesPerRow();
//.........这里部分代码省略.........
示例9: BufferDuration
BBuffer*
AudioProducer::_FillNextBuffer(bigtime_t eventTime)
{
BBuffer* buffer = fBufferGroup->RequestBuffer(
fOutput.format.u.raw_audio.buffer_size, BufferDuration());
if (!buffer) {
ERROR("AudioProducer::_FillNextBuffer() - no buffer\n");
return NULL;
}
size_t sampleSize = fOutput.format.u.raw_audio.format
& media_raw_audio_format::B_AUDIO_SIZE_MASK;
size_t numSamples = fOutput.format.u.raw_audio.buffer_size / sampleSize;
// number of sample in the buffer
// fill in the buffer header
media_header* header = buffer->Header();
header->type = B_MEDIA_RAW_AUDIO;
header->time_source = TimeSource()->ID();
buffer->SetSizeUsed(fOutput.format.u.raw_audio.buffer_size);
bigtime_t performanceTime = bigtime_t(double(fFramesSent)
* 1000000.0 / double(fOutput.format.u.raw_audio.frame_rate));
// fill in data from audio supplier
int64 frameCount = numSamples / fOutput.format.u.raw_audio.channel_count;
bigtime_t startTime = performanceTime;
bigtime_t endTime = bigtime_t(double(fFramesSent + frameCount)
* 1000000.0 / fOutput.format.u.raw_audio.frame_rate);
if (!fSupplier || fSupplier->InitCheck() != B_OK
|| fSupplier->GetFrames(buffer->Data(), frameCount, startTime,
endTime) != B_OK) {
ERROR("AudioProducer::_FillNextBuffer() - supplier error -> silence\n");
memset(buffer->Data(), 0, buffer->SizeUsed());
}
// stamp buffer
if (RunMode() == B_RECORDING) {
header->start_time = eventTime;
} else {
header->start_time = fStartTime + performanceTime;
}
#if DEBUG_TO_FILE
BMediaTrack* track;
if (BMediaFile* file = init_media_file(fOutput.format, &track)) {
track->WriteFrames(buffer->Data(), frameCount);
}
#endif // DEBUG_TO_FILE
if (fPeakListener
&& fOutput.format.u.raw_audio.format
== media_raw_audio_format::B_AUDIO_FLOAT) {
// TODO: extend the peak notifier for other sample formats
int32 channels = fOutput.format.u.raw_audio.channel_count;
float max[channels];
float min[channels];
for (int32 i = 0; i < channels; i++) {
max[i] = -1.0;
min[i] = 1.0;
}
float* sample = (float*)buffer->Data();
for (uint32 i = 0; i < frameCount; i++) {
for (int32 k = 0; k < channels; k++) {
if (*sample < min[k])
min[k] = *sample;
if (*sample > max[k])
max[k] = *sample;
sample++;
}
}
BMessage message(MSG_PEAK_NOTIFICATION);
for (int32 i = 0; i < channels; i++) {
float maxAbs = max_c(fabs(min[i]), fabs(max[i]));
message.AddFloat("max", maxAbs);
}
bigtime_t realTime = TimeSource()->RealTimeFor(
fStartTime + performanceTime, 0);
MessageEvent* event = new (std::nothrow) MessageEvent(realTime,
fPeakListener, message);
if (event != NULL)
EventQueue::Default().AddEvent(event);
}
return buffer;
}
示例10: entry
void
VideoFileTexture::_Load(const char* fileName)
{
BEntry entry(fileName);
entry_ref ref;
entry.GetRef(&ref);
fMediaFile = new BMediaFile(&ref);
status_t err = fMediaFile->InitCheck();
if (err != B_OK) {
printf("cannot contruct BMediaFile object -- %s\n", strerror(err));
return;
}
int32 trackCount = fMediaFile->CountTracks();
for (int32 i = 0; i < trackCount; i++) {
BMediaTrack* track = fMediaFile->TrackAt(i);
if (track == NULL) {
printf("cannot contruct BMediaTrack object\n");
return;
}
// get the encoded format
media_format format;
err = track->EncodedFormat(&format);
if (err != B_OK) {
printf("BMediaTrack::EncodedFormat error -- %s\n", strerror(err));
return;
}
if (format.type == B_MEDIA_ENCODED_VIDEO) {
fVideoTrack = track;
// allocate a bitmap large enough to contain the decoded frame.
BRect bounds(0.0, 0.0,
format.u.encoded_video.output.display.line_width - 1.0,
format.u.encoded_video.output.display.line_count - 1.0);
fVideoBitmap = new BBitmap(bounds, B_RGB32);
// specifiy the decoded format. we derive this information from
// the encoded format.
memset(&format, 0, sizeof(media_format));
format.u.raw_video.last_active = (int32) (bounds.Height() - 1.0);
format.u.raw_video.orientation = B_VIDEO_TOP_LEFT_RIGHT;
format.u.raw_video.pixel_width_aspect = 1;
format.u.raw_video.pixel_height_aspect = 3;
format.u.raw_video.display.format = fVideoBitmap->ColorSpace();
format.u.raw_video.display.line_width = (int32) bounds.Width();
format.u.raw_video.display.line_count = (int32) bounds.Height();
format.u.raw_video.display.bytes_per_row
= fVideoBitmap->BytesPerRow();
err = fVideoTrack->DecodedFormat(&format);
if (err != B_OK) {
printf("error with BMediaTrack::DecodedFormat() -- %s\n",
strerror(err));
return;
}
// Create Texture
glGenTextures(1, &fId);
glBindTexture(GL_TEXTURE_2D, fId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 4,
(int) fVideoBitmap->Bounds().Width() + 1,
(int) fVideoBitmap->Bounds().Height() + 1,
0, GL_BGRA, GL_UNSIGNED_BYTE, fVideoBitmap->Bits());
}
}
}
示例11: autolock
status_t
MediaView::SetMediaSource(BPositionIO *data)
{
BAutolock autolock(Window());
fMediaFile = new BMediaFile(data);
file = data;
bool foundTrack = false;
int32 numTracks = fMediaFile->CountTracks();
for (int32 i = 0; i < numTracks; i++) {
BMediaTrack *track = fMediaFile->TrackAt(i);
if (track == NULL) {
Reset();
return (B_ERROR);
}
else {
bool trackUsed = false;
media_format mf;
if (track->EncodedFormat(&mf) == B_NO_ERROR) {
switch (mf.type) {
case B_MEDIA_ENCODED_VIDEO:
printf("#################field rate %f\n", mf.u.encoded_video.output.field_rate);
trackUsed = SetVideoTrack(data, track, &mf) == B_NO_ERROR;
break;
case B_MEDIA_RAW_AUDIO:
trackUsed = SetAudioTrack(data, track, &mf) == B_NO_ERROR;
break;
case B_MEDIA_ENCODED_AUDIO:
if (track->DecodedFormat(&mf) == B_NO_ERROR)
trackUsed = SetAudioTrack(data, track, &mf) == B_NO_ERROR;
break;
default:
break;
}
}
if (trackUsed)
foundTrack = true;
else {
fMediaFile->ReleaseTrack(track);
}
}
}
if (foundTrack) {
status_t err = B_ERROR;
fPlayerThread = spawn_thread(MediaView::MediaPlayer,
"MediaView::MediaPlayer",
95,
this);
if (fPlayerThread < B_NO_ERROR) {
err = fPlayerThread;
fPlayerThread = B_ERROR;
Reset();
return (err);
}
fPlaySem = create_sem(0, "MediaView::fPlaySem");
if (fPlaySem < B_NO_ERROR) {
err = fPlaySem;
fPlaySem = B_ERROR;
Reset();
return (err);
}
err = resume_thread(fPlayerThread);
if (err != B_NO_ERROR) {
kill_thread(fPlayerThread);
fPlayerThread = B_ERROR;
Reset();
return (err);
}
if (fVideoTrack != NULL)
fMediaBar->SetTotalTime(fVideoTrack->Duration());
else
fMediaBar->SetTotalTime(fAudioTrack->Duration());
}
return (B_NO_ERROR);
}
示例12: sizeof
status_t
MediaConverterApp::_ConvertFile(BMediaFile* inFile, BMediaFile* outFile,
media_codec_info* audioCodec, media_codec_info* videoCodec,
int32 audioQuality, int32 videoQuality,
bigtime_t startDuration, bigtime_t endDuration)
{
BMediaTrack* inVidTrack = NULL;
BMediaTrack* inAudTrack = NULL;
BMediaTrack* outVidTrack = NULL;
BMediaTrack* outAudTrack = NULL;
media_format inFormat;
media_format outAudFormat;
media_format outVidFormat;
media_raw_audio_format* raf = NULL;
media_raw_video_format* rvf = NULL;
int32 width = -1;
int32 height = -1;
uint8* videoBuffer = NULL;
uint8* audioBuffer = NULL;
// gather the necessary format information and construct output tracks
int64 videoFrameCount = 0;
int64 audioFrameCount = 0;
status_t ret = B_OK;
int32 tracks = inFile->CountTracks();
for (int32 i = 0; i < tracks && (!outAudTrack || !outVidTrack); i++) {
BMediaTrack* inTrack = inFile->TrackAt(i);
memset(&inFormat, 0, sizeof(media_format));
inTrack->EncodedFormat(&inFormat);
if (inFormat.IsAudio() && (audioCodec != NULL)) {
inAudTrack = inTrack;
memset(&outAudFormat, 0, sizeof(media_format));
outAudFormat.type = B_MEDIA_RAW_AUDIO;
raf = &(outAudFormat.u.raw_audio);
inTrack->DecodedFormat(&outAudFormat);
audioBuffer = new uint8[raf->buffer_size];
// audioFrameSize = (raf->format & media_raw_audio_format::B_AUDIO_SIZE_MASK)
// audioFrameSize = (raf->format & 0xf) * raf->channel_count;
outAudTrack = outFile->CreateTrack(&outAudFormat, audioCodec);
if (outAudTrack != NULL) {
if (outAudTrack->SetQuality(audioQuality / 100.0f) != B_OK
&& fWin->Lock()) {
fWin->SetAudioQualityLabel(
B_TRANSLATE("Audio quality not supported"));
fWin->Unlock();
}
}
} else if (inFormat.IsVideo() && (videoCodec != NULL)) {
inVidTrack = inTrack;
width = (int32)inFormat.Width();
height = (int32)inFormat.Height();
// construct desired decoded video format
memset(&outVidFormat, 0, sizeof(outVidFormat));
outVidFormat.type = B_MEDIA_RAW_VIDEO;
rvf = &(outVidFormat.u.raw_video);
rvf->last_active = (uint32)(height - 1);
rvf->orientation = B_VIDEO_TOP_LEFT_RIGHT;
rvf->display.format = B_RGB32;
rvf->display.bytes_per_row = 4 * width;
rvf->display.line_width = width;
rvf->display.line_count = height;
inVidTrack->DecodedFormat(&outVidFormat);
if (rvf->display.format == B_RGBA32) {
printf("fixing color space (B_RGBA32 -> B_RGB32)");
rvf->display.format = B_RGB32;
}
// Transfer the display aspect ratio.
if (inFormat.type == B_MEDIA_ENCODED_VIDEO) {
rvf->pixel_width_aspect
= inFormat.u.encoded_video.output.pixel_width_aspect;
rvf->pixel_height_aspect
= inFormat.u.encoded_video.output.pixel_height_aspect;
} else {
rvf->pixel_width_aspect
= inFormat.u.raw_video.pixel_width_aspect;
rvf->pixel_height_aspect
= inFormat.u.raw_video.pixel_height_aspect;
}
videoBuffer = new (std::nothrow) uint8[height
* rvf->display.bytes_per_row];
outVidTrack = outFile->CreateTrack(&outVidFormat, videoCodec);
if (outVidTrack != NULL) {
// DLM Added to use 3ivx Parameter View
const char* videoQualitySupport = NULL;
BView* encoderView = outVidTrack->GetParameterView();
if (encoderView) {
//.........这里部分代码省略.........
示例13: MessageReceived
void LeftList::MessageReceived(BMessage* msg)
{
struct AudioInfo fAudioInfo;
BMediaFile* testfile;
bool fIsAudio = false;
BMediaTrack* track;
media_codec_info codecInfo;
media_format format;
memset(&format, 0, sizeof(format));
entry_ref ref;
int32 counter = 0;
switch (msg->what) {
case B_SIMPLE_DATA:
while (msg->FindRef("refs", counter++, &ref) == B_OK) {
if ((testfile = new BMediaFile(&ref)) != NULL) {
testfile->InitCheck();
track = testfile->TrackAt(0);
if (track != NULL) {
track->EncodedFormat(&format);
if (format.IsAudio()) {
memset(&format, 0, sizeof(format));
format.type = B_MEDIA_RAW_AUDIO;
track->DecodedFormat(&format);
fAudioInfo.total_time = track->Duration();
media_raw_audio_format* raf = &(format.u.raw_audio);
fAudioInfo.bps = (int32)(raf->format & 0xf);
fAudioInfo.frame_rate = (int32)raf->frame_rate;
fAudioInfo.channels = (int32)raf->channel_count;
track->GetCodecInfo(&codecInfo);
strcpy(fAudioInfo.pretty_name, codecInfo.pretty_name);
strcpy(fAudioInfo.short_name, codecInfo.short_name);
fIsAudio = true;
}
}
} else
WriteLog("MediaFile NULL (file doesnt exists!?)");
delete testfile;
if (fIsAudio) {
if (!strcmp(fAudioInfo.pretty_name, "Raw Audio") && (fAudioInfo.channels == 2) && (fAudioInfo.frame_rate == 44100) && (fAudioInfo.bps == 2))
AddItem(new LeftListItem(&ref, ref.name, fAudioBitmap, &fAudioInfo));
else {
BAlert* MyAlert = new BAlert("BurnItNow", "You can only burn 16 bits stereo 44.1 kHz Raw Audio files.\n (More audio files will be supported in the future)", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_INFO_ALERT);
MyAlert->Go();
}
} else {
BPath temp_path;
BEntry(&ref).GetPath(&temp_path);
jpWindow* win = dynamic_cast<jpWindow*>(Window());
if (win != NULL)
win->SetISOFile((char*)temp_path.Path());
}
}
break;
default:
BListView::MessageReceived(msg);
break;
}
}
示例14: media_play
int media_play(const char* uri)
{
BUrl url;
entry_ref ref;
BMediaFile* playFile;
if (get_ref_for_path(uri, &ref) != B_OK) {
url.SetUrlString(uri);
if (url.IsValid()) {
playFile = new BMediaFile(url);
} else
return 2;
} else
playFile = new BMediaFile(&ref);
if (playFile->InitCheck() != B_OK) {
delete playFile;
return 2;
}
for (int i = 0; i < playFile->CountTracks(); i++) {
BMediaTrack* track = playFile->TrackAt(i);
playFormat.type = B_MEDIA_RAW_AUDIO;
if ((track->DecodedFormat(&playFormat) == B_OK)
&& (playFormat.type == B_MEDIA_RAW_AUDIO)) {
playTrack = track;
break;
}
if (track)
playFile->ReleaseTrack(track);
}
// Good relations with the Wookiees, I have.
signal(SIGINT, keyb_int);
finished = create_sem(0, "finish wait");
printf("Playing file...\n");
// Execute Plan 66!
player = new BSoundPlayer(&playFormat.u.raw_audio, "playfile", play_buffer);
player->SetVolume(1.0f);
// Join me, Padmé and together we can rule this galaxy.
player->SetHasData(true);
player->Start();
acquire_sem(finished);
if (interrupt == true) {
// Once more, the Sith will rule the galaxy.
printf("Interrupted\n");
player->Stop();
kill_thread(reader);
}
printf("Playback finished.\n");
delete player;
delete playFile;
return 0;
}
示例15: main
int
main(int argc, char *argv[])
{
// 256 frames * 4 buffer parts * 2 channels * 2 bytes per sample
// will give us internal buffer of 4096 bytes
size_t framesPerBufferPart = 256;
size_t bufferPartCount = 4;
if (argc != 2 && argc != 4) {
printf("Usage: %s <sound file name> [<frames per part> <parts>]\n",
argv[0]);
return 0;
}
if (argc == 4) {
size_t size = strtoul(argv[2], NULL, 10);
if (size > 0)
framesPerBufferPart = size;
size = strtoul(argv[3], NULL, 10);
if (size == 1) {
printf("at least 2 buffer parts are needed\n");
return 1;
}
if (size > 0)
bufferPartCount = size;
}
printf("frames per buffer part: %ld\n", framesPerBufferPart);
printf("buffer part count: %ld\n", bufferPartCount);
BEntry entry(argv[1]);
if (entry.InitCheck() != B_OK || !entry.Exists()) {
printf("cannot open input file\n");
return 1;
}
entry_ref entryRef;
entry.GetRef(&entryRef);
BMediaFile mediaFile(&entryRef);
if (mediaFile.InitCheck() != B_OK) {
printf("file not supported\n");
return 1;
}
if (mediaFile.CountTracks() == 0) {
printf("no tracks found in file\n");
return 1;
}
BMediaTrack *mediaTrack = mediaFile.TrackAt(0);
if (mediaTrack == NULL) {
printf("problem getting track from file\n");
return 1;
}
// propose format, let it decide frame rate, channels number and buf size
media_format format;
memset(&format, 0, sizeof(format));
format.type = B_MEDIA_RAW_AUDIO;
format.u.raw_audio.format = media_raw_audio_format::B_AUDIO_SHORT;
format.u.raw_audio.byte_order = B_MEDIA_LITTLE_ENDIAN;
if (mediaTrack->DecodedFormat(&format) != B_OK) {
printf("cannot set decoder output format\n");
return 1;
}
printf("negotiated format:\n");
printf("frame rate: %g Hz\n", format.u.raw_audio.frame_rate);
printf("channel count: %ld\n", format.u.raw_audio.channel_count);
printf("buffer size: %ld bytes\n", format.u.raw_audio.buffer_size);
gs_audio_format gsFormat;
memset(&gsFormat, 0, sizeof(gsFormat));
gsFormat.frame_rate = format.u.raw_audio.frame_rate;
gsFormat.channel_count = format.u.raw_audio.channel_count;
gsFormat.format = format.u.raw_audio.format;
gsFormat.byte_order = format.u.raw_audio.byte_order;
BPushGameSound pushGameSound(framesPerBufferPart, &gsFormat,
bufferPartCount);
if (pushGameSound.InitCheck() != B_OK) {
printf("trouble initializing push game sound: %s\n",
strerror(pushGameSound.InitCheck()));
return 1;
}
uint8 *buffer;
size_t bufferSize;
if (pushGameSound.LockForCyclic((void **)&buffer, &bufferSize)
!= BPushGameSound::lock_ok) {
printf("cannot lock buffer\n");
return 1;
}
memset(buffer, 0, bufferSize);
if (pushGameSound.StartPlaying() != B_OK) {
printf("cannot start playback\n");
//.........这里部分代码省略.........