#include "VideoMixerNode.h"
#include <stdio.h>
#include <string.h>
status_t VideoMixerNode::FormatSuggestionRequested(
media_type type,
int32 quality,
media_format * format)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::FormatSuggestionRequested\n");
if (format->type == B_MEDIA_NO_TYPE) {
format->type = B_MEDIA_RAW_VIDEO;
}
if (format->type != B_MEDIA_RAW_VIDEO) {
return B_MEDIA_BAD_FORMAT;
}
GetOutputFormat(format);
return B_OK;
}
status_t VideoMixerNode::FormatProposal(
const media_source &output_source,
media_format *format)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::FormatProposal\n");
fOutput.source = output_source;
if (fConnectedInputs.size() > 0) {
if (fOutput.format.u.raw_video == media_raw_video_format::wildcard) {
fOutput.format = fConnectedInputs[0]->format;
fOutput.format.u.raw_video.display.format = B_NO_COLOR_SPACE;
} else {
fOutput.format = fConnectedInputs[0]->format;
fOutput.format.u.raw_video.display.format = B_RGBA32;
}
}
*format = fOutput.format;
return B_OK;
}
status_t VideoMixerNode::FormatChangeRequested(
const media_source &source,
const media_destination &destination,
media_format *io_format,
int32 * _deprecated_)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::FormatChangeRequested\n");
if (fOutput.source != source) {
fprintf(stderr, "<- B_MEDIA_BAD_SOURCE\n");
return B_MEDIA_BAD_SOURCE;
}
fOutput.destination = destination;
fOutput.format = *io_format;
return B_OK;
}
status_t VideoMixerNode::GetNextOutput(
int32 *cookie,
media_output *out_output)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::GetNextOutput (%" B_PRId32 ")\n", *cookie);
if (*cookie != 0) {
fprintf(stderr, "<- B_ERROR (no more outputs)\n");
return B_ERROR;
}
*out_output = fOutput;
*cookie = 1;
return B_OK;
}
status_t VideoMixerNode::DisposeOutputCookie(int32 cookie)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::DisposeOutputCookie\n");
return B_OK;
}
status_t VideoMixerNode::SetBufferGroup(
const media_source & for_source,
BBufferGroup * group)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::SetBufferGroup\n");
if (fOutput.source != for_source) {
fprintf(stderr, "<- B_MEDIA_BAD_SOURCE\n");
return B_MEDIA_BAD_SOURCE;
}
return B_OK;
}
status_t VideoMixerNode::VideoClippingChanged(
const media_source & for_source,
int16 num_shorts,
int16 * clip_data,
const media_video_display_info & display,
int32 * _deprecated_)
{
return BBufferProducer::VideoClippingChanged(for_source, num_shorts, clip_data, display, _deprecated_);
}
status_t VideoMixerNode::GetLatency(
bigtime_t *out_latency)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::GetLatency\n");
if (out_latency == NULL) {
fprintf(stderr, "<- B_BAD_VALUE\n");
return B_BAD_VALUE;
}
*out_latency = EventLatency() + SchedulingLatency();
return B_OK;
}
status_t VideoMixerNode::PrepareToConnect(
const media_source &what,
const media_destination &where,
media_format *format,
media_source *out_source,
char *out_name)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::PrepareToConnect\n");
if (fOutput.source != what) {
fprintf(stderr, "<- B_MEDIA_BAD_SOURCE\n");
return B_MEDIA_BAD_SOURCE;
}
*out_source = fOutput.source;
strcpy(out_name, fOutput.name);
fOutput.destination = where;
return B_OK;
}
void VideoMixerNode::Connect(
status_t error,
const media_source &source,
const media_destination &destination,
const media_format &format,
char *io_name)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::Connect\n");
if (fOutput.source != source) {
fprintf(stderr, "<- B_MEDIA_BAD_SOURCE\n");
return;
}
if (error != B_OK) {
fprintf(stderr, "<- error already\n");
fOutput.destination = media_destination::null;
fOutput.format.u.raw_video = media_raw_video_format::wildcard;
return;
}
bigtime_t downstreamLatency;
media_node_id id;
FindLatencyFor(fOutput.destination, &downstreamLatency, &id);
fOutput.format = format;
fOutput.destination = destination;
strcpy(io_name, fOutput.name);
if (fInternalLatency == 0) {
fInternalLatency = 100;
ComputeInternalLatency();
}
if (downstreamLatency > fDownstreamLatency) {
SetEventLatency(fDownstreamLatency + fInternalLatency);
}
}
void VideoMixerNode::ComputeInternalLatency() {
fprintf(stderr, "VideoMixerNode(BBufferProducer)::ComputeInternalLatency\n");
fInternalLatency = 100;
fprintf(stderr, " internal latency guessed = %" B_PRIdBIGTIME "\n", fInternalLatency);
}
void VideoMixerNode::Disconnect(
const media_source & what,
const media_destination & where)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::Disconnect\n");
if (fOutput.source != what) {
fprintf(stderr, "<- B_MEDIA_BAD_SOURCE\n");
return;
}
if (fOutput.destination != where) {
fprintf(stderr, "<- B_MEDIA_BAD_DESTINATION\n");
return;
}
fOutput.destination = media_destination::null;
GetOutputFormat(&fOutput.format);
}
void VideoMixerNode::LateNoticeReceived(
const media_source & what,
bigtime_t how_much,
bigtime_t performance_time)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::LateNoticeReceived\n");
if (fOutput.source != what) {
fprintf(stderr, "<- B_MEDIA_BAD_SOURCE\n");
return;
}
switch (RunMode()) {
case B_OFFLINE:
break;
case B_RECORDING:
break;
case B_INCREASE_LATENCY:
fInternalLatency += how_much;
SetEventLatency(fDownstreamLatency + fInternalLatency);
break;
case B_DECREASE_PRECISION:
break;
case B_DROP_DATA:
break;
default:
fprintf(stderr, "VideoMixerNode::LateNoticeReceived with unexpected run mode.\n");
break;
}
}
void VideoMixerNode::EnableOutput(
const media_source &what,
bool enabled,
int32 *_deprecated_)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::EnableOutput\n");
if (fOutput.source != what) {
fprintf(stderr, "<- B_MEDIA_BAD_SOURCE\n");
return;
}
status_t status = B_OK;
if (status != B_OK) {
fprintf(stderr, " error in itr->EnableOutput\n");
}
}
status_t VideoMixerNode::SetPlayRate(
int32 numer,
int32 denom)
{
BBufferProducer::SetPlayRate(numer, denom);
return B_OK;
}
void VideoMixerNode::AdditionalBufferRequested(
const media_source & source,
media_buffer_id prev_buffer,
bigtime_t prev_time,
const media_seek_tag * prev_tag)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::AdditionalBufferRequested\n");
if (fOutput.source != source) {
fprintf(stderr, "<- B_MEDIA_BAD_SOURCE\n");
return;
}
}
void VideoMixerNode::LatencyChanged(
const media_source & source,
const media_destination & destination,
bigtime_t new_latency,
uint32 flags)
{
fprintf(stderr, "VideoMixerNode(BBufferProducer)::LatencyChanged\n");
if (fOutput.source != source) {
fprintf(stderr, "<- B_MEDIA_BAD_SOURCE\n");
return;
}
if (fOutput.destination != destination) {
fprintf(stderr, "<- B_MEDIA_BAD_DESTINATION\n");
return;
}
fDownstreamLatency = new_latency;
SetEventLatency(fDownstreamLatency + fInternalLatency);
}