Try to use overlay first

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36892 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
David McPaul 2010-05-22 05:27:15 +00:00
parent dc706a1b49
commit da4fcd47f5

View File

@ -152,8 +152,11 @@ VideoNode::HandleEvent(const media_timed_event *event, bigtime_t lateness,
case BTimedEventQueue::B_HANDLE_BUFFER:
HandleBuffer((BBuffer *)event->pointer);
break;
case BTimedEventQueue::B_SEEK:
fprintf(stderr, "VideoNode::HandleEvent Seek event not handled\n");
break;
default:
fprintf(stderr, "VideoNode::HandleEvent unknown event");
fprintf(stderr, "VideoNode::HandleEvent unknown event\n");
break;
}
}
@ -199,6 +202,44 @@ VideoNode::AcceptFormat(const media_destination &dst, media_format *format)
if (format->type != B_MEDIA_RAW_VIDEO)
return B_MEDIA_BAD_FORMAT;
// In order to display video we need to create a buffer that is either
// in the overlay colorspace B_YCbCr422
// or the requested colorspace if not B_YCbCr422
// and we need to tell the node upstream of our choice
BRect frame(0, 0, format->u.raw_video.display.line_width - 1,
format->u.raw_video.display.line_count - 1);
DeleteBuffers();
status_t err;
if (format->u.raw_video.display.format == B_NO_COLOR_SPACE) {
// upstream node is leaving it up to us so we try overlay then B_RGBA32 (We probably should try what format the screen is)
err = CreateBuffers(frame, B_YCbCr422, true);
SetOverlayEnabled(err == B_OK);
if (!fOverlayEnabled) {
// no overlay available so fall back to RGBA32
err = CreateBuffers(frame, B_RGBA32, false);
}
} else if (format->u.raw_video.display.format == B_YCbCr422) {
// upstream node is likely requesting overlay
err = CreateBuffers(frame, B_YCbCr422, true);
SetOverlayEnabled(err == B_OK);
// if we cannot give them what they want then return error
} else {
// upstream node is requesting some other format
SetOverlayEnabled(false);
err = CreateBuffers(frame, format->u.raw_video.display.format, fOverlayEnabled);
}
if (err) {
fprintf(stderr, "VideoNode::Connected failed, fOverlayEnabled = %d\n",
fOverlayEnabled);
return err;
} else {
format->u.raw_video.display.format = fBitmap->ColorSpace();
}
return B_OK;
}
@ -224,23 +265,6 @@ VideoNode::Connected(const media_source &src, const media_destination &dst,
if (fInput.format.u.raw_video.field_rate < 1.0)
fInput.format.u.raw_video.field_rate = 25.0;
color_space colorspace = format.u.raw_video.display.format;
BRect frame(0, 0, format.u.raw_video.display.line_width - 1,
format.u.raw_video.display.line_count - 1);
DeleteBuffers();
status_t err = CreateBuffers(frame, colorspace, fOverlayEnabled);
if (err && fOverlayEnabled) {
SetOverlayEnabled(false);
err = CreateBuffers(frame, colorspace, fOverlayEnabled);
}
if (err) {
fprintf(stderr, "VideoNode::Connected failed, fOverlayEnabled = %d\n",
fOverlayEnabled);
return err;
}
*out_input = fInput;
return B_OK;
@ -376,11 +400,11 @@ VideoNode::CreateBuffers(BRect frame, color_space cspace, bool overlay)
fBitmap = new BBitmap(frame, flags, cspace);
if (!(fBitmap && fBitmap->InitCheck() == B_OK && fBitmap->IsValid())) {
delete fBitmap;
fBitmap = 0;
fBitmap = NULL;
fOverlayActive = false;
UnlockBitmap();
fprintf(stderr, "VideoNode::CreateBuffers failed\n");
return B_ERROR;
return B_MEDIA_BAD_FORMAT;
}
fOverlayActive = overlay;
UnlockBitmap();