* Patch by Jorma Karvonnen : localize TV application and style fixes. Thanks !
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37303 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -37,7 +37,8 @@ ConvertBitmap(BBitmap *dst, const BBitmap *src)
|
|||||||
if (dst->Bounds() != src->Bounds())
|
if (dst->Bounds() != src->Bounds())
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
if (dst->ColorSpace() == src->ColorSpace() && dst->BytesPerRow() == src->BytesPerRow() ) {
|
if (dst->ColorSpace() == src->ColorSpace()
|
||||||
|
&& dst->BytesPerRow() == src->BytesPerRow() ) {
|
||||||
memcpy(dst->Bits(), src->Bits(), src->BitsLength());
|
memcpy(dst->Bits(), src->Bits(), src->BitsLength());
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,9 +38,11 @@ DeviceRoster::DeviceRoster()
|
|||||||
live_node_info info[MAX_DEVICE_COUNT];
|
live_node_info info[MAX_DEVICE_COUNT];
|
||||||
int32 info_count = MAX_DEVICE_COUNT;
|
int32 info_count = MAX_DEVICE_COUNT;
|
||||||
status_t err;
|
status_t err;
|
||||||
err = MediaRoster()->GetLiveNodes(info, &info_count, NULL, NULL, "DVB*", B_BUFFER_PRODUCER | B_PHYSICAL_INPUT);
|
err = MediaRoster()->GetLiveNodes(info, &info_count, NULL, NULL, "DVB*",
|
||||||
|
B_BUFFER_PRODUCER | B_PHYSICAL_INPUT);
|
||||||
if (err != B_OK || info_count < 1) {
|
if (err != B_OK || info_count < 1) {
|
||||||
printf("Can't find live DVB node. Found %ld nodes, error %08lx (%s)\n", info_count, err, strerror(err));
|
printf("Can't find live DVB node. Found %ld nodes, error %08lx (%s)\n",
|
||||||
|
info_count, err, strerror(err));
|
||||||
fDeviceCount = 0;
|
fDeviceCount = 0;
|
||||||
} else {
|
} else {
|
||||||
fDeviceCount = info_count;
|
fDeviceCount = info_count;
|
||||||
@@ -89,7 +91,8 @@ DeviceRoster::IsRawAudioOutputFree(int i)
|
|||||||
int32 count;
|
int32 count;
|
||||||
status_t err;
|
status_t err;
|
||||||
|
|
||||||
err = MediaRoster()->GetFreeOutputsFor(fDeviceInfo[i].node, &output, 1, &count, B_MEDIA_RAW_AUDIO);
|
err = MediaRoster()->GetFreeOutputsFor(fDeviceInfo[i].node, &output, 1,
|
||||||
|
&count, B_MEDIA_RAW_AUDIO);
|
||||||
return (err == B_OK) && (count == 1);
|
return (err == B_OK) && (count == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,7 +106,8 @@ DeviceRoster::IsEncAudioOutputFree(int i)
|
|||||||
int32 count;
|
int32 count;
|
||||||
status_t err;
|
status_t err;
|
||||||
|
|
||||||
err = MediaRoster()->GetFreeOutputsFor(fDeviceInfo[i].node, &output, 1, &count, B_MEDIA_ENCODED_AUDIO);
|
err = MediaRoster()->GetFreeOutputsFor(fDeviceInfo[i].node, &output, 1,
|
||||||
|
&count, B_MEDIA_ENCODED_AUDIO);
|
||||||
return (err == B_OK) && (count == 1);
|
return (err == B_OK) && (count == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,7 +121,8 @@ DeviceRoster::IsRawVideoOutputFree(int i)
|
|||||||
int32 count;
|
int32 count;
|
||||||
status_t err;
|
status_t err;
|
||||||
|
|
||||||
err = MediaRoster()->GetFreeOutputsFor(fDeviceInfo[i].node, &output, 1, &count, B_MEDIA_RAW_VIDEO);
|
err = MediaRoster()->GetFreeOutputsFor(fDeviceInfo[i].node, &output, 1,
|
||||||
|
&count, B_MEDIA_RAW_VIDEO);
|
||||||
return (err == B_OK) && (count == 1);
|
return (err == B_OK) && (count == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,7 +136,8 @@ DeviceRoster::IsEncVideoOutputFree(int i)
|
|||||||
int32 count;
|
int32 count;
|
||||||
status_t err;
|
status_t err;
|
||||||
|
|
||||||
err = MediaRoster()->GetFreeOutputsFor(fDeviceInfo[i].node, &output, 1, &count, B_MEDIA_ENCODED_VIDEO);
|
err = MediaRoster()->GetFreeOutputsFor(fDeviceInfo[i].node, &output, 1,
|
||||||
|
&count, B_MEDIA_ENCODED_VIDEO);
|
||||||
return (err == B_OK) && (count == 1);
|
return (err == B_OK) && (count == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-1
@@ -8,6 +8,13 @@ Application TV :
|
|||||||
MainWin.cpp
|
MainWin.cpp
|
||||||
VideoNode.cpp
|
VideoNode.cpp
|
||||||
VideoView.cpp
|
VideoView.cpp
|
||||||
: be media $(TARGET_LIBSUPC++)
|
: be locale media $(TARGET_LIBSUPC++)
|
||||||
: tv.rdef
|
: tv.rdef
|
||||||
;
|
;
|
||||||
|
|
||||||
|
DoCatalogs TV :
|
||||||
|
x-vnd.Haiku.TV
|
||||||
|
:
|
||||||
|
MainApp.cpp
|
||||||
|
MainWin.cpp
|
||||||
|
;
|
||||||
|
|||||||
@@ -33,15 +33,22 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "DeviceRoster.h"
|
#include "DeviceRoster.h"
|
||||||
|
|
||||||
|
#undef B_TRANSLATE_CONTEXT
|
||||||
|
#define B_TRANSLATE_CONTEXT "MainApp"
|
||||||
|
|
||||||
|
|
||||||
MainApp *gMainApp;
|
MainApp *gMainApp;
|
||||||
|
|
||||||
bool gOverlayDisabled = false;
|
bool gOverlayDisabled = false;
|
||||||
|
|
||||||
MainApp::MainApp()
|
MainApp::MainApp()
|
||||||
: BApplication(APP_SIG)
|
:
|
||||||
|
BApplication(APP_SIG)
|
||||||
{
|
{
|
||||||
InitPrefs();
|
InitPrefs();
|
||||||
|
|
||||||
|
be_locale->GetAppCatalog(&fAppCatalog);
|
||||||
|
|
||||||
gDeviceRoster = new DeviceRoster;
|
gDeviceRoster = new DeviceRoster;
|
||||||
|
|
||||||
fMainWindow = NewWindow();
|
fMainWindow = NewWindow();
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
BWindow * fMainWindow;
|
BWindow * fMainWindow;
|
||||||
|
BCatalog fAppCatalog;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern MainApp *gMainApp;
|
extern MainApp *gMainApp;
|
||||||
|
|||||||
+261
-118
@@ -28,18 +28,27 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "DeviceRoster.h"
|
#include "DeviceRoster.h"
|
||||||
|
|
||||||
#include <View.h>
|
#include <stdio.h>
|
||||||
#include <Screen.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <Application.h>
|
||||||
|
#include <Alert.h>
|
||||||
#include <Menu.h>
|
#include <Menu.h>
|
||||||
#include <MenuBar.h>
|
#include <MenuBar.h>
|
||||||
#include <MenuItem.h>
|
#include <MenuItem.h>
|
||||||
#include <Application.h>
|
|
||||||
#include <Alert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <Messenger.h>
|
#include <Messenger.h>
|
||||||
#include <PopUpMenu.h>
|
#include <PopUpMenu.h>
|
||||||
|
#include <Screen.h>
|
||||||
#include <String.h>
|
#include <String.h>
|
||||||
|
#include <View.h>
|
||||||
|
|
||||||
|
|
||||||
|
#undef B_TRANSLATE_CONTEXT
|
||||||
|
#define B_TRANSLATE_CONTEXT "MainWin"
|
||||||
|
|
||||||
|
static const char* fLocalizedName = B_TRANSLATE_MARK("TV");
|
||||||
|
static const char* fLocalizedRevision = B_TRANSLATE_MARK("unknown");
|
||||||
|
static const char* fLocalizedInfo1 = B_TRANSLATE_MARK("DVB - Digital Video Broadcasting TV");
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
@@ -68,14 +77,16 @@ enum
|
|||||||
M_SELECT_INTERFACE = 0x00000800,
|
M_SELECT_INTERFACE = 0x00000800,
|
||||||
M_SELECT_INTERFACE_END = 0x00000fff,
|
M_SELECT_INTERFACE_END = 0x00000fff,
|
||||||
M_SELECT_CHANNEL = 0x00010000,
|
M_SELECT_CHANNEL = 0x00010000,
|
||||||
M_SELECT_CHANNEL_END = 0x000fffff, // this limits possible channel count to 0xeffff = 983039
|
M_SELECT_CHANNEL_END = 0x000fffff,
|
||||||
|
// this limits possible channel count to 0xeffff = 983039
|
||||||
};
|
};
|
||||||
|
|
||||||
//#define printf(a...)
|
//#define printf(a...)
|
||||||
|
|
||||||
|
|
||||||
MainWin::MainWin(BRect frame_rect)
|
MainWin::MainWin(BRect frame_rect)
|
||||||
: BWindow(frame_rect, NAME, B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS /* | B_WILL_ACCEPT_FIRST_CLICK */)
|
: BWindow(frame_rect, NAME, B_TITLED_WINDOW,
|
||||||
|
B_ASYNCHRONOUS_CONTROLS /* | B_WILL_ACCEPT_FIRST_CLICK */)
|
||||||
, fController(new Controller)
|
, fController(new Controller)
|
||||||
, fIsFullscreen(false)
|
, fIsFullscreen(false)
|
||||||
, fKeepAspectRatio(true)
|
, fKeepAspectRatio(true)
|
||||||
@@ -92,9 +103,10 @@ MainWin::MainWin(BRect frame_rect)
|
|||||||
, fFrameResizedCalled(true)
|
, fFrameResizedCalled(true)
|
||||||
{
|
{
|
||||||
BRect rect = Bounds();
|
BRect rect = Bounds();
|
||||||
|
|
||||||
// background
|
// background
|
||||||
fBackground = new BView(rect, "background", B_FOLLOW_ALL, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE);
|
fBackground = new BView(rect, "background", B_FOLLOW_ALL,
|
||||||
|
B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE);
|
||||||
fBackground->SetViewColor(0,0,0);
|
fBackground->SetViewColor(0,0,0);
|
||||||
AddChild(fBackground);
|
AddChild(fBackground);
|
||||||
|
|
||||||
@@ -108,13 +120,15 @@ MainWin::MainWin(BRect frame_rect)
|
|||||||
|
|
||||||
// video view
|
// video view
|
||||||
BRect video_rect = BRect(0, fMenuBarHeight, rect.right, rect.bottom);
|
BRect video_rect = BRect(0, fMenuBarHeight, rect.right, rect.bottom);
|
||||||
fVideoView = new VideoView(video_rect, "video display", B_FOLLOW_ALL, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE);
|
fVideoView = new VideoView(video_rect, "video display", B_FOLLOW_ALL,
|
||||||
|
B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE);
|
||||||
fBackground->AddChild(fVideoView);
|
fBackground->AddChild(fVideoView);
|
||||||
|
|
||||||
fVideoView->MakeFocus();
|
fVideoView->MakeFocus();
|
||||||
|
|
||||||
// SetSizeLimits(fControlViewMinWidth - 1, 32767,
|
// SetSizeLimits(fControlViewMinWidth - 1, 32767,
|
||||||
// fMenuBarHeight + fControlViewHeight - 1, fMenuBarHeight + fControlViewHeight - 1);
|
// fMenuBarHeight + fControlViewHeight - 1, fMenuBarHeight
|
||||||
|
// + fControlViewHeight - 1);
|
||||||
|
|
||||||
// SetSizeLimits(320 - 1, 32767, 240 + fMenuBarHeight - 1, 32767);
|
// SetSizeLimits(320 - 1, 32767, 240 + fMenuBarHeight - 1, 32767);
|
||||||
|
|
||||||
@@ -149,10 +163,10 @@ void
|
|||||||
MainWin::CreateMenu()
|
MainWin::CreateMenu()
|
||||||
{
|
{
|
||||||
fFileMenu = new BMenu(NAME);
|
fFileMenu = new BMenu(NAME);
|
||||||
fChannelMenu = new BMenu("Channel");
|
fChannelMenu = new BMenu(B_TRANSLATE("Channel"));
|
||||||
fInterfaceMenu = new BMenu("Interface");
|
fInterfaceMenu = new BMenu(B_TRANSLATE("Interface"));
|
||||||
fSettingsMenu = new BMenu("Settings");
|
fSettingsMenu = new BMenu(B_TRANSLATE("Settings"));
|
||||||
fDebugMenu = new BMenu("Debug");
|
fDebugMenu = new BMenu(B_TRANSLATE("Debug"));
|
||||||
|
|
||||||
fMenuBar->AddItem(fFileMenu);
|
fMenuBar->AddItem(fFileMenu);
|
||||||
fMenuBar->AddItem(fChannelMenu);
|
fMenuBar->AddItem(fChannelMenu);
|
||||||
@@ -160,46 +174,85 @@ MainWin::CreateMenu()
|
|||||||
fMenuBar->AddItem(fSettingsMenu);
|
fMenuBar->AddItem(fSettingsMenu);
|
||||||
fMenuBar->AddItem(fDebugMenu);
|
fMenuBar->AddItem(fDebugMenu);
|
||||||
|
|
||||||
fFileMenu->AddItem(new BMenuItem("About " NAME B_UTF8_ELLIPSIS, new BMessage(M_FILE_ABOUT)));
|
BString aboutStr = B_TRANSLATE_COMMENT("About %1"B_UTF8_ELLIPSIS,
|
||||||
|
"Parameter %1 is the name of the application.");
|
||||||
|
aboutStr.ReplaceFirst("%1", fLocalizedName);
|
||||||
|
fFileMenu->AddItem(new BMenuItem(aboutStr.String(),
|
||||||
|
new BMessage(M_FILE_ABOUT)));
|
||||||
fFileMenu->AddSeparatorItem();
|
fFileMenu->AddSeparatorItem();
|
||||||
fFileMenu->AddItem(new BMenuItem("Quit", new BMessage(M_FILE_QUIT), 'Q', B_COMMAND_KEY));
|
fFileMenu->AddItem(new BMenuItem(B_TRANSLATE("Quit"),
|
||||||
|
new BMessage(M_FILE_QUIT), 'Q', B_COMMAND_KEY));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
fChannelMenu->AddItem(new BMenuItem("Next channel", new BMessage(M_CHANNEL_NEXT), '+', B_COMMAND_KEY));
|
fChannelMenu->AddItem(new BMenuItem(B_TRANSLATE("Next channel"),
|
||||||
fChannelMenu->AddItem(new BMenuItem("Previous channel", new BMessage(M_CHANNEL_PREV), '-', B_COMMAND_KEY));
|
new BMessage(M_CHANNEL_NEXT), '+', B_COMMAND_KEY));
|
||||||
|
fChannelMenu->AddItem(new BMenuItem(B_TRANSLATE("Previous channel"),
|
||||||
|
new BMessage(M_CHANNEL_PREV), '-', B_COMMAND_KEY));
|
||||||
fChannelMenu->AddSeparatorItem();
|
fChannelMenu->AddSeparatorItem();
|
||||||
fChannelMenu->AddItem(new BMenuItem("RTL", new BMessage(M_DUMMY), '0', B_COMMAND_KEY));
|
fChannelMenu->AddItem(new BMenuItem("RTL", new BMessage(M_DUMMY), '0',
|
||||||
fChannelMenu->AddItem(new BMenuItem("Pro7", new BMessage(M_DUMMY), '1', B_COMMAND_KEY));
|
B_COMMAND_KEY));
|
||||||
|
fChannelMenu->AddItem(new BMenuItem("Pro7", new BMessage(M_DUMMY), '1',
|
||||||
|
B_COMMAND_KEY));
|
||||||
|
|
||||||
fInterfaceMenu->AddItem(new BMenuItem("none", new BMessage(M_DUMMY)));
|
fInterfaceMenu->AddItem(new BMenuItem(B_TRANSLATE("none"),
|
||||||
fInterfaceMenu->AddItem(new BMenuItem("none 1", new BMessage(M_DUMMY)));
|
new BMessage(M_DUMMY)));
|
||||||
fInterfaceMenu->AddItem(new BMenuItem("none 2", new BMessage(M_DUMMY)));
|
fInterfaceMenu->AddItem(new BMenuItem(B_TRANSLATE("none 1"),
|
||||||
|
new BMessage(M_DUMMY)));
|
||||||
|
fInterfaceMenu->AddItem(new BMenuItem(B_TRANSLATE("none 2"),
|
||||||
|
new BMessage(M_DUMMY)));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fSettingsMenu->AddItem(new BMenuItem("Scale to native size", new BMessage(M_SCALE_TO_NATIVE_SIZE), 'N', B_COMMAND_KEY));
|
fSettingsMenu->AddItem(new BMenuItem(B_TRANSLATE("Scale to native size"),
|
||||||
fSettingsMenu->AddItem(new BMenuItem("Full screen", new BMessage(M_TOGGLE_FULLSCREEN), 'F', B_COMMAND_KEY));
|
new BMessage(M_SCALE_TO_NATIVE_SIZE), 'N', B_COMMAND_KEY));
|
||||||
|
fSettingsMenu->AddItem(new BMenuItem(B_TRANSLATE("Full screen"),
|
||||||
|
new BMessage(M_TOGGLE_FULLSCREEN), 'F', B_COMMAND_KEY));
|
||||||
fSettingsMenu->AddSeparatorItem();
|
fSettingsMenu->AddSeparatorItem();
|
||||||
fSettingsMenu->AddItem(new BMenuItem("No menu", new BMessage(M_TOGGLE_NO_MENU), 'M', B_COMMAND_KEY));
|
fSettingsMenu->AddItem(new BMenuItem(B_TRANSLATE("No menu"),
|
||||||
fSettingsMenu->AddItem(new BMenuItem("No border", new BMessage(M_TOGGLE_NO_BORDER), 'B', B_COMMAND_KEY));
|
new BMessage(M_TOGGLE_NO_MENU), 'M', B_COMMAND_KEY));
|
||||||
fSettingsMenu->AddItem(new BMenuItem("Always on top", new BMessage(M_TOGGLE_ALWAYS_ON_TOP), 'T', B_COMMAND_KEY));
|
fSettingsMenu->AddItem(new BMenuItem(B_TRANSLATE("No border"),
|
||||||
fSettingsMenu->AddItem(new BMenuItem("Keep aspect ratio", new BMessage(M_TOGGLE_KEEP_ASPECT_RATIO), 'K', B_COMMAND_KEY));
|
new BMessage(M_TOGGLE_NO_BORDER), 'B', B_COMMAND_KEY));
|
||||||
|
fSettingsMenu->AddItem(new BMenuItem(B_TRANSLATE("Always on top"),
|
||||||
|
new BMessage(M_TOGGLE_ALWAYS_ON_TOP), 'T', B_COMMAND_KEY));
|
||||||
|
fSettingsMenu->AddItem(new BMenuItem(B_TRANSLATE("Keep aspect ratio"),
|
||||||
|
new BMessage(M_TOGGLE_KEEP_ASPECT_RATIO), 'K', B_COMMAND_KEY));
|
||||||
fSettingsMenu->AddSeparatorItem();
|
fSettingsMenu->AddSeparatorItem();
|
||||||
fSettingsMenu->AddItem(new BMenuItem("Settings"B_UTF8_ELLIPSIS, new BMessage(M_PREFERENCES), 'P', B_COMMAND_KEY));
|
fSettingsMenu->AddItem(new BMenuItem(B_TRANSLATE("Settings"B_UTF8_ELLIPSIS)
|
||||||
|
, new BMessage(M_PREFERENCES), 'P', B_COMMAND_KEY));
|
||||||
|
|
||||||
fDebugMenu->AddItem(new BMenuItem("pixel aspect ratio 1.00000:1", new BMessage(M_ASPECT_100000_1)));
|
const char* pixel_ratio = B_TRANSLATE("pixel aspect ratio");
|
||||||
fDebugMenu->AddItem(new BMenuItem("pixel aspect ratio 1.06666:1", new BMessage(M_ASPECT_106666_1)));
|
BString str1 = pixel_ratio;
|
||||||
fDebugMenu->AddItem(new BMenuItem("pixel aspect ratio 1.09091:1", new BMessage(M_ASPECT_109091_1)));
|
str1 << " 1.00000:1";
|
||||||
fDebugMenu->AddItem(new BMenuItem("pixel aspect ratio 1.41176:1", new BMessage(M_ASPECT_141176_1)));
|
fDebugMenu->AddItem(new BMenuItem(str1.String(),
|
||||||
fDebugMenu->AddItem(new BMenuItem("force 720 x 576, display aspect 4:3", new BMessage(M_ASPECT_720_576)));
|
new BMessage(M_ASPECT_100000_1)));
|
||||||
fDebugMenu->AddItem(new BMenuItem("force 704 x 576, display aspect 4:3", new BMessage(M_ASPECT_704_576)));
|
BString str2 = pixel_ratio;
|
||||||
fDebugMenu->AddItem(new BMenuItem("force 544 x 576, display aspect 4:3", new BMessage(M_ASPECT_544_576)));
|
str2 << " 1.06666:1";
|
||||||
|
fDebugMenu->AddItem(new BMenuItem(str2.String(),
|
||||||
|
new BMessage(M_ASPECT_106666_1)));
|
||||||
|
BString str3 = pixel_ratio;
|
||||||
|
str3 << " 1.09091:1";
|
||||||
|
fDebugMenu->AddItem(new BMenuItem(str3.String(),
|
||||||
|
new BMessage(M_ASPECT_109091_1)));
|
||||||
|
BString str4 = pixel_ratio;
|
||||||
|
str4 << " 1.41176:1";
|
||||||
|
fDebugMenu->AddItem(new BMenuItem(str4.String(),
|
||||||
|
new BMessage(M_ASPECT_141176_1)));
|
||||||
|
fDebugMenu->AddItem(new BMenuItem(B_TRANSLATE(
|
||||||
|
"force 720 x 576, display aspect 4:3"),
|
||||||
|
new BMessage(M_ASPECT_720_576)));
|
||||||
|
fDebugMenu->AddItem(new BMenuItem(B_TRANSLATE(
|
||||||
|
"force 704 x 576, display aspect 4:3"),
|
||||||
|
new BMessage(M_ASPECT_704_576)));
|
||||||
|
fDebugMenu->AddItem(new BMenuItem(B_TRANSLATE(
|
||||||
|
"force 544 x 576, display aspect 4:3"),
|
||||||
|
new BMessage(M_ASPECT_544_576)));
|
||||||
|
|
||||||
fSettingsMenu->ItemAt(1)->SetMarked(fIsFullscreen);
|
fSettingsMenu->ItemAt(1)->SetMarked(fIsFullscreen);
|
||||||
fSettingsMenu->ItemAt(3)->SetMarked(fNoMenu);
|
fSettingsMenu->ItemAt(3)->SetMarked(fNoMenu);
|
||||||
fSettingsMenu->ItemAt(4)->SetMarked(fNoBorder);
|
fSettingsMenu->ItemAt(4)->SetMarked(fNoBorder);
|
||||||
fSettingsMenu->ItemAt(5)->SetMarked(fAlwaysOnTop);
|
fSettingsMenu->ItemAt(5)->SetMarked(fAlwaysOnTop);
|
||||||
fSettingsMenu->ItemAt(6)->SetMarked(fKeepAspectRatio);
|
fSettingsMenu->ItemAt(6)->SetMarked(fKeepAspectRatio);
|
||||||
fSettingsMenu->ItemAt(8)->SetEnabled(false); // XXX disable unused preference menu
|
fSettingsMenu->ItemAt(8)->SetEnabled(false);
|
||||||
|
// XXX disable unused preference menu
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -208,7 +261,8 @@ MainWin::SetupInterfaceMenu()
|
|||||||
{
|
{
|
||||||
fInterfaceMenu->RemoveItems(0, fInterfaceMenu->CountItems(), true);
|
fInterfaceMenu->RemoveItems(0, fInterfaceMenu->CountItems(), true);
|
||||||
|
|
||||||
fInterfaceMenu->AddItem(new BMenuItem("None", new BMessage(M_SELECT_INTERFACE)));
|
fInterfaceMenu->AddItem(new BMenuItem(B_TRANSLATE("None"),
|
||||||
|
new BMessage(M_SELECT_INTERFACE)));
|
||||||
|
|
||||||
int count = gDeviceRoster->DeviceCount();
|
int count = gDeviceRoster->DeviceCount();
|
||||||
|
|
||||||
@@ -216,8 +270,10 @@ MainWin::SetupInterfaceMenu()
|
|||||||
fInterfaceMenu->AddSeparatorItem();
|
fInterfaceMenu->AddSeparatorItem();
|
||||||
|
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
// 1 gets subtracted in MessageReceived, so -1 is Interface None, and 0 == Interface 0 in SelectInterface()
|
// 1 gets subtracted in MessageReceived, so -1 is Interface None,
|
||||||
fInterfaceMenu->AddItem(new BMenuItem(gDeviceRoster->DeviceName(i), new BMessage(M_SELECT_INTERFACE + i + 1)));
|
// and 0 == Interface 0 in SelectInterface()
|
||||||
|
fInterfaceMenu->AddItem(new BMenuItem(gDeviceRoster->DeviceName(i),
|
||||||
|
new BMessage(M_SELECT_INTERFACE + i + 1)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,10 +289,13 @@ MainWin::SetupChannelMenu()
|
|||||||
int channels = fController->ChannelCount();
|
int channels = fController->ChannelCount();
|
||||||
|
|
||||||
if (channels == 0) {
|
if (channels == 0) {
|
||||||
fChannelMenu->AddItem(new BMenuItem("None", new BMessage(M_DUMMY)));
|
fChannelMenu->AddItem(new BMenuItem(B_TRANSLATE("None"),
|
||||||
|
new BMessage(M_DUMMY)));
|
||||||
} else {
|
} else {
|
||||||
fChannelMenu->AddItem(new BMenuItem("Next channel", new BMessage(M_CHANNEL_NEXT), '+', B_COMMAND_KEY));
|
fChannelMenu->AddItem(new BMenuItem(B_TRANSLATE("Next channel"),
|
||||||
fChannelMenu->AddItem(new BMenuItem("Previous channel", new BMessage(M_CHANNEL_PREV), '-', B_COMMAND_KEY));
|
new BMessage(M_CHANNEL_NEXT), '+', B_COMMAND_KEY));
|
||||||
|
fChannelMenu->AddItem(new BMenuItem(B_TRANSLATE("Previous channel"),
|
||||||
|
new BMessage(M_CHANNEL_PREV), '-', B_COMMAND_KEY));
|
||||||
fChannelMenu->AddSeparatorItem();
|
fChannelMenu->AddSeparatorItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -318,16 +377,18 @@ MainWin::SelectInterface(int i)
|
|||||||
|
|
||||||
if (!fController->IsInterfaceAvailable(i)) {
|
if (!fController->IsInterfaceAvailable(i)) {
|
||||||
BString s;
|
BString s;
|
||||||
s << "Error, interface is busy:\n\n" << gDeviceRoster->DeviceName(i);
|
s << B_TRANSLATE("Error, interface is busy:\n\n");
|
||||||
(new BAlert("error", s.String(), "OK"))->Go();
|
s << gDeviceRoster->DeviceName(i);
|
||||||
|
(new BAlert("error", s.String(), B_TRANSLATE("OK")))->Go();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fController->DisconnectInterface();
|
fController->DisconnectInterface();
|
||||||
if (fController->ConnectInterface(i) != B_OK) {
|
if (fController->ConnectInterface(i) != B_OK) {
|
||||||
BString s;
|
BString s;
|
||||||
s << "Error, connecting to interface failed:\n\n" << gDeviceRoster->DeviceName(i);
|
s << B_TRANSLATE("Error, connecting to interface failed:\n\n");
|
||||||
(new BAlert("error", s.String(), "OK"))->Go();
|
s << gDeviceRoster->DeviceName(i);
|
||||||
|
(new BAlert("error", s.String(), B_TRANSLATE("OK")))->Go();
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
@@ -348,8 +409,10 @@ MainWin::SelectInitialInterface()
|
|||||||
|
|
||||||
int count = gDeviceRoster->DeviceCount();
|
int count = gDeviceRoster->DeviceCount();
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
if (fController->IsInterfaceAvailable(i) && B_OK == fController->ConnectInterface(i)) {
|
if (fController->IsInterfaceAvailable(i)
|
||||||
printf("MainWin::SelectInitialInterface connected to interface %d\n", i);
|
&& B_OK == fController->ConnectInterface(i)) {
|
||||||
|
printf("MainWin::SelectInitialInterface connected to interface "
|
||||||
|
"%d\n", i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -372,7 +435,8 @@ MainWin::MouseDown(BMessage *msg)
|
|||||||
BPoint screen_where;
|
BPoint screen_where;
|
||||||
uint32 buttons = msg->FindInt32("buttons");
|
uint32 buttons = msg->FindInt32("buttons");
|
||||||
|
|
||||||
// On Zeta, only "screen_where" is relyable, "where" and "be:view_where" seem to be broken
|
// On Zeta, only "screen_where" is relyable, "where" and "be:view_where"
|
||||||
|
// seem to be broken
|
||||||
if (B_OK != msg->FindPoint("screen_where", &screen_where)) {
|
if (B_OK != msg->FindPoint("screen_where", &screen_where)) {
|
||||||
// Workaround for BeOS R5, it has no "screen_where"
|
// Workaround for BeOS R5, it has no "screen_where"
|
||||||
fVideoView->GetMouse(&screen_where, &buttons, false);
|
fVideoView->GetMouse(&screen_where, &buttons, false);
|
||||||
@@ -384,7 +448,8 @@ MainWin::MouseDown(BMessage *msg)
|
|||||||
// if (1 == msg->FindInt32("buttons") && msg->FindInt32("clicks") == 1) {
|
// if (1 == msg->FindInt32("buttons") && msg->FindInt32("clicks") == 1) {
|
||||||
|
|
||||||
if (1 == buttons && msg->FindInt32("clicks") % 2 == 0) {
|
if (1 == buttons && msg->FindInt32("clicks") % 2 == 0) {
|
||||||
BRect r(screen_where.x - 1, screen_where.y - 1, screen_where.x + 1, screen_where.y + 1);
|
BRect r(screen_where.x - 1, screen_where.y - 1, screen_where.x + 1,
|
||||||
|
screen_where.y + 1);
|
||||||
if (r.Contains(fMouseDownMousePos)) {
|
if (r.Contains(fMouseDownMousePos)) {
|
||||||
PostMessage(M_TOGGLE_FULLSCREEN);
|
PostMessage(M_TOGGLE_FULLSCREEN);
|
||||||
return;
|
return;
|
||||||
@@ -392,7 +457,8 @@ MainWin::MouseDown(BMessage *msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (2 == buttons && msg->FindInt32("clicks") % 2 == 0) {
|
if (2 == buttons && msg->FindInt32("clicks") % 2 == 0) {
|
||||||
BRect r(screen_where.x - 1, screen_where.y - 1, screen_where.x + 1, screen_where.y + 1);
|
BRect r(screen_where.x - 1, screen_where.y - 1, screen_where.x + 1,
|
||||||
|
screen_where.y + 1);
|
||||||
if (r.Contains(fMouseDownMousePos)) {
|
if (r.Contains(fMouseDownMousePos)) {
|
||||||
PostMessage(M_TOGGLE_NO_BORDER_NO_MENU);
|
PostMessage(M_TOGGLE_NO_BORDER_NO_MENU);
|
||||||
return;
|
return;
|
||||||
@@ -401,14 +467,16 @@ MainWin::MouseDown(BMessage *msg)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
// very broken in Zeta:
|
// very broken in Zeta:
|
||||||
fMouseDownMousePos = fVideoView->ConvertToScreen(msg->FindPoint("where"));
|
fMouseDownMousePos = fVideoView->ConvertToScreen(
|
||||||
|
msg->FindPoint("where"));
|
||||||
*/
|
*/
|
||||||
fMouseDownMousePos = screen_where;
|
fMouseDownMousePos = screen_where;
|
||||||
fMouseDownWindowPos = Frame().LeftTop();
|
fMouseDownWindowPos = Frame().LeftTop();
|
||||||
|
|
||||||
if (buttons == 1 && !fIsFullscreen) {
|
if (buttons == 1 && !fIsFullscreen) {
|
||||||
// start mouse tracking
|
// start mouse tracking
|
||||||
fVideoView->SetMouseEventMask(B_POINTER_EVENTS | B_NO_POINTER_HISTORY /* | B_LOCK_WINDOW_FOCUS */);
|
fVideoView->SetMouseEventMask(B_POINTER_EVENTS | B_NO_POINTER_HISTORY
|
||||||
|
/* | B_LOCK_WINDOW_FOCUS */);
|
||||||
fMouseDownTracking = true;
|
fMouseDownTracking = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -446,7 +514,8 @@ MainWin::MouseMoved(BMessage *msg)
|
|||||||
printf("view where: %.0f, %.0f => ", mousePos.x, mousePos.y);
|
printf("view where: %.0f, %.0f => ", mousePos.x, mousePos.y);
|
||||||
fVideoView->ConvertToScreen(&mousePos);
|
fVideoView->ConvertToScreen(&mousePos);
|
||||||
*/
|
*/
|
||||||
// On Zeta, only "screen_where" is relyable, "where" and "be:view_where" seem to be broken
|
// On Zeta, only "screen_where" is relyable, "where" and
|
||||||
|
// "be:view_where" seem to be broken
|
||||||
if (B_OK != msg->FindPoint("screen_where", &mousePos)) {
|
if (B_OK != msg->FindPoint("screen_where", &mousePos)) {
|
||||||
// Workaround for BeOS R5, it has no "screen_where"
|
// Workaround for BeOS R5, it has no "screen_where"
|
||||||
fVideoView->GetMouse(&mousePos, &buttons, false);
|
fVideoView->GetMouse(&mousePos, &buttons, false);
|
||||||
@@ -477,49 +546,83 @@ MainWin::ShowContextMenu(const BPoint &screen_point)
|
|||||||
printf("Show context menu\n");
|
printf("Show context menu\n");
|
||||||
BPopUpMenu *menu = new BPopUpMenu("context menu", false, false);
|
BPopUpMenu *menu = new BPopUpMenu("context menu", false, false);
|
||||||
BMenuItem *item;
|
BMenuItem *item;
|
||||||
menu->AddItem(new BMenuItem("Scale to native size", new BMessage(M_SCALE_TO_NATIVE_SIZE), 'N', B_COMMAND_KEY));
|
menu->AddItem(new BMenuItem(B_TRANSLATE("Scale to native size"),
|
||||||
menu->AddItem(item = new BMenuItem("Full screen", new BMessage(M_TOGGLE_FULLSCREEN), 'F', B_COMMAND_KEY));
|
new BMessage(M_SCALE_TO_NATIVE_SIZE), 'N', B_COMMAND_KEY));
|
||||||
|
menu->AddItem(item = new BMenuItem(B_TRANSLATE("Full screen"),
|
||||||
|
new BMessage(M_TOGGLE_FULLSCREEN), 'F', B_COMMAND_KEY));
|
||||||
item->SetMarked(fIsFullscreen);
|
item->SetMarked(fIsFullscreen);
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
menu->AddItem(item = new BMenuItem("No menu", new BMessage(M_TOGGLE_NO_MENU), 'M', B_COMMAND_KEY));
|
menu->AddItem(item = new BMenuItem(B_TRANSLATE("No menu"),
|
||||||
|
new BMessage(M_TOGGLE_NO_MENU), 'M', B_COMMAND_KEY));
|
||||||
item->SetMarked(fNoMenu);
|
item->SetMarked(fNoMenu);
|
||||||
menu->AddItem(item = new BMenuItem("No border", new BMessage(M_TOGGLE_NO_BORDER), 'B', B_COMMAND_KEY));
|
menu->AddItem(item = new BMenuItem(B_TRANSLATE("No border"),
|
||||||
|
new BMessage(M_TOGGLE_NO_BORDER), 'B', B_COMMAND_KEY));
|
||||||
item->SetMarked(fNoBorder);
|
item->SetMarked(fNoBorder);
|
||||||
menu->AddItem(item = new BMenuItem("Always on top", new BMessage(M_TOGGLE_ALWAYS_ON_TOP), 'T', B_COMMAND_KEY));
|
menu->AddItem(item = new BMenuItem(B_TRANSLATE("Always on top"),
|
||||||
|
new BMessage(M_TOGGLE_ALWAYS_ON_TOP), 'T', B_COMMAND_KEY));
|
||||||
item->SetMarked(fAlwaysOnTop);
|
item->SetMarked(fAlwaysOnTop);
|
||||||
menu->AddItem(item = new BMenuItem("Keep aspect ratio", new BMessage(M_TOGGLE_KEEP_ASPECT_RATIO), 'K', B_COMMAND_KEY));
|
menu->AddItem(item = new BMenuItem(B_TRANSLATE("Keep aspect ratio"),
|
||||||
|
new BMessage(M_TOGGLE_KEEP_ASPECT_RATIO), 'K', B_COMMAND_KEY));
|
||||||
item->SetMarked(fKeepAspectRatio);
|
item->SetMarked(fKeepAspectRatio);
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
menu->AddItem(new BMenuItem("About " NAME B_UTF8_ELLIPSIS, new BMessage(M_FILE_ABOUT)));
|
BString aboutStr = B_TRANSLATE_COMMENT("About %1"B_UTF8_ELLIPSIS,
|
||||||
|
"Parameter %1 is the name of the application.");
|
||||||
|
aboutStr.ReplaceFirst("%1", fLocalizedName);
|
||||||
|
menu->AddItem(new BMenuItem(aboutStr.String(),
|
||||||
|
new BMessage(M_FILE_ABOUT)));
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
menu->AddItem(new BMenuItem("Quit", new BMessage(M_FILE_QUIT), 'Q', B_COMMAND_KEY));
|
menu->AddItem(new BMenuItem(B_TRANSLATE("Quit"),
|
||||||
|
new BMessage(M_FILE_QUIT), 'Q', B_COMMAND_KEY));
|
||||||
|
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
menu->AddItem(new BMenuItem("pixel aspect ratio 1.00000:1", new BMessage(M_ASPECT_100000_1)));
|
const char* pixel_aspect = "pixel aspect ratio";
|
||||||
menu->AddItem(new BMenuItem("pixel aspect ratio 1.06666:1", new BMessage(M_ASPECT_106666_1)));
|
BString str1 = pixel_aspect;
|
||||||
menu->AddItem(new BMenuItem("pixel aspect ratio 1.09091:1", new BMessage(M_ASPECT_109091_1)));
|
str1 << " 1.00000:1";
|
||||||
menu->AddItem(new BMenuItem("pixel aspect ratio 1.41176:1", new BMessage(M_ASPECT_141176_1)));
|
menu->AddItem(new BMenuItem(str1.String(),
|
||||||
menu->AddItem(new BMenuItem("force 720 x 576, display aspect 4:3", new BMessage(M_ASPECT_720_576)));
|
new BMessage(M_ASPECT_100000_1)));
|
||||||
menu->AddItem(new BMenuItem("force 704 x 576, display aspect 4:3", new BMessage(M_ASPECT_704_576)));
|
BString str2 = pixel_aspect;
|
||||||
menu->AddItem(new BMenuItem("force 544 x 576, display aspect 4:3", new BMessage(M_ASPECT_544_576)));
|
str2 << " 1.06666:1";
|
||||||
|
menu->AddItem(new BMenuItem(str2.String(),
|
||||||
|
new BMessage(M_ASPECT_106666_1)));
|
||||||
|
BString str3 = pixel_aspect;
|
||||||
|
str3 << " 1.09091:1";
|
||||||
|
menu->AddItem(new BMenuItem(str3.String(),
|
||||||
|
new BMessage(M_ASPECT_109091_1)));
|
||||||
|
BString str4 = pixel_aspect;
|
||||||
|
str4 << " 1.41176:1";
|
||||||
|
menu->AddItem(new BMenuItem(str4.String(),
|
||||||
|
new BMessage(M_ASPECT_141176_1)));
|
||||||
|
menu->AddItem(new BMenuItem(B_TRANSLATE(
|
||||||
|
"force 720 x 576, display aspect 4:3"),
|
||||||
|
new BMessage(M_ASPECT_720_576)));
|
||||||
|
menu->AddItem(new BMenuItem(B_TRANSLATE(
|
||||||
|
"force 704 x 576, display aspect 4:3"),
|
||||||
|
new BMessage(M_ASPECT_704_576)));
|
||||||
|
menu->AddItem(new BMenuItem(B_TRANSLATE(
|
||||||
|
"force 544 x 576, display aspect 4:3"),
|
||||||
|
new BMessage(M_ASPECT_544_576)));
|
||||||
|
|
||||||
menu->SetTargetForItems(this);
|
menu->SetTargetForItems(this);
|
||||||
BRect r(screen_point.x - 5, screen_point.y - 5, screen_point.x + 5, screen_point.y + 5);
|
BRect r(screen_point.x - 5, screen_point.y - 5, screen_point.x + 5,
|
||||||
|
screen_point.y + 5);
|
||||||
menu->Go(screen_point, true, true, r, true);
|
menu->Go(screen_point, true, true, r, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MainWin::VideoFormatChange(int width, int height, float width_scale, float height_scale)
|
MainWin::VideoFormatChange(int width, int height, float width_scale,
|
||||||
|
float height_scale)
|
||||||
{
|
{
|
||||||
// called when video format or aspect ratio changes
|
// called when video format or aspect ratio changes
|
||||||
|
|
||||||
printf("VideoFormatChange enter: width %d, height %d, width_scale %.6f, height_scale %.6f\n", width, height, width_scale, height_scale);
|
printf("VideoFormatChange enter: width %d, height %d, width_scale %.6f, "
|
||||||
|
"height_scale %.6f\n", width, height, width_scale, height_scale);
|
||||||
|
|
||||||
if (width_scale < 1.0 && height_scale >= 1.0) {
|
if (width_scale < 1.0 && height_scale >= 1.0) {
|
||||||
width_scale = 1.0 / width_scale;
|
width_scale = 1.0 / width_scale;
|
||||||
height_scale = 1.0 / height_scale;
|
height_scale = 1.0 / height_scale;
|
||||||
printf("inverting! new values: width_scale %.6f, height_scale %.6f\n", width_scale, height_scale);
|
printf("inverting! new values: width_scale %.6f, height_scale %.6f\n",
|
||||||
|
width_scale, height_scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
fSourceWidth = width;
|
fSourceWidth = width;
|
||||||
@@ -558,7 +661,9 @@ MainWin::FrameResized(float new_width, float new_height)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
printf("FrameResized enter: new_width %.0f, new_height %.0f, bounds width %.0f, bounds height %.0f\n", new_width, new_height, Bounds().Width(), Bounds().Height());
|
printf("FrameResized enter: new_width %.0f, new_height %.0f, bounds width "
|
||||||
|
"%.0f, bounds height %.0f\n", new_width, new_height, Bounds().Width(),
|
||||||
|
Bounds().Height());
|
||||||
|
|
||||||
if (fIsFullscreen) {
|
if (fIsFullscreen) {
|
||||||
|
|
||||||
@@ -599,7 +704,9 @@ void
|
|||||||
MainWin::UpdateWindowTitle()
|
MainWin::UpdateWindowTitle()
|
||||||
{
|
{
|
||||||
char buf[100];
|
char buf[100];
|
||||||
sprintf(buf, "%s - %d x %d, %.3f:%.3f => %.0f x %.0f", NAME, fSourceWidth, fSourceHeight, fWidthScale, fHeightScale, fVideoView->Bounds().Width() + 1, fVideoView->Bounds().Height() + 1);
|
sprintf(buf, "%s - %d x %d, %.3f:%.3f => %.0f x %.0f", NAME, fSourceWidth,
|
||||||
|
fSourceHeight, fWidthScale, fHeightScale,
|
||||||
|
fVideoView->Bounds().Width() + 1, fVideoView->Bounds().Height() + 1);
|
||||||
SetTitle(buf);
|
SetTitle(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -617,16 +724,18 @@ MainWin::AdjustFullscreenRenderer()
|
|||||||
float max_height = fBackground->Bounds().Height() + 1.0f;
|
float max_height = fBackground->Bounds().Height() + 1.0f;
|
||||||
float scaled_width = fSourceWidth * fWidthScale;
|
float scaled_width = fSourceWidth * fWidthScale;
|
||||||
float scaled_height = fSourceHeight * fHeightScale;
|
float scaled_height = fSourceHeight * fHeightScale;
|
||||||
float factor = min_c(max_width / scaled_width, max_height / scaled_height);
|
float factor = min_c(max_width / scaled_width, max_height
|
||||||
|
/ scaled_height);
|
||||||
int render_width = int(scaled_width * factor);
|
int render_width = int(scaled_width * factor);
|
||||||
int render_height = int(scaled_height * factor);
|
int render_height = int(scaled_height * factor);
|
||||||
int x_ofs = (int(max_width) - render_width) / 2;
|
int x_ofs = (int(max_width) - render_width) / 2;
|
||||||
int y_ofs = (int(max_height) - render_height) / 2;
|
int y_ofs = (int(max_height) - render_height) / 2;
|
||||||
|
|
||||||
printf("AdjustFullscreenRenderer: background %.1f x %.1f, src video %d x %d, "
|
printf("AdjustFullscreenRenderer: background %.1f x %.1f, src video "
|
||||||
"scaled video %.3f x %.3f, factor %.3f, render %d x %d, x-ofs %d, y-ofs %d\n",
|
"%d x %d, scaled video %.3f x %.3f, factor %.3f, render %d x %d, "
|
||||||
max_width, max_height, fSourceWidth, fSourceHeight, scaled_width, scaled_height,
|
"x-ofs %d, y-ofs %d\n", max_width, max_height, fSourceWidth,
|
||||||
factor, render_width, render_height, x_ofs, y_ofs);
|
fSourceHeight, scaled_width, scaled_height, factor, render_width,
|
||||||
|
render_height, x_ofs, y_ofs);
|
||||||
|
|
||||||
fVideoView->MoveTo(x_ofs, y_ofs);
|
fVideoView->MoveTo(x_ofs, y_ofs);
|
||||||
fVideoView->ResizeTo(render_width - 1, render_height - 1);
|
fVideoView->ResizeTo(render_width - 1, render_height - 1);
|
||||||
@@ -638,7 +747,8 @@ MainWin::AdjustFullscreenRenderer()
|
|||||||
// no need to keep aspect ratio, make
|
// no need to keep aspect ratio, make
|
||||||
// render cover the whole background
|
// render cover the whole background
|
||||||
fVideoView->MoveTo(0, 0);
|
fVideoView->MoveTo(0, 0);
|
||||||
fVideoView->ResizeTo(fBackground->Bounds().Width(), fBackground->Bounds().Height());
|
fVideoView->ResizeTo(fBackground->Bounds().Width(),
|
||||||
|
fBackground->Bounds().Height());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -652,24 +762,28 @@ MainWin::AdjustWindowedRenderer(bool user_resized)
|
|||||||
// In windowed mode, the renderer always covers the
|
// In windowed mode, the renderer always covers the
|
||||||
// whole background, accounting for the menu
|
// whole background, accounting for the menu
|
||||||
fVideoView->MoveTo(0, fNoMenu ? 0 : fMenuBarHeight);
|
fVideoView->MoveTo(0, fNoMenu ? 0 : fMenuBarHeight);
|
||||||
fVideoView->ResizeTo(fBackground->Bounds().Width(), fBackground->Bounds().Height() - (fNoMenu ? 0 : fMenuBarHeight));
|
fVideoView->ResizeTo(fBackground->Bounds().Width(),
|
||||||
|
fBackground->Bounds().Height() - (fNoMenu ? 0 : fMenuBarHeight));
|
||||||
|
|
||||||
if (fKeepAspectRatio) {
|
if (fKeepAspectRatio) {
|
||||||
// To keep the aspect ratio correct, we
|
// To keep the aspect ratio correct, we
|
||||||
// do resize the window as required
|
// do resize the window as required
|
||||||
|
|
||||||
float max_width = Bounds().Width() + 1.0f;
|
float max_width = Bounds().Width() + 1.0f;
|
||||||
float max_height = Bounds().Height() + 1.0f - (fNoMenu ? 0 : fMenuBarHeight);
|
float max_height = Bounds().Height() + 1.0f - (fNoMenu ? 0
|
||||||
|
: fMenuBarHeight);
|
||||||
float scaled_width = fSourceWidth * fWidthScale;
|
float scaled_width = fSourceWidth * fWidthScale;
|
||||||
float scaled_height = fSourceHeight * fHeightScale;
|
float scaled_height = fSourceHeight * fHeightScale;
|
||||||
|
|
||||||
if (!user_resized && (scaled_width > max_width || scaled_height > max_height)) {
|
if (!user_resized && (scaled_width > max_width
|
||||||
|
|| scaled_height > max_height)) {
|
||||||
// A format switch occured, and the window was
|
// A format switch occured, and the window was
|
||||||
// smaller then the video source. As it was not
|
// smaller then the video source. As it was not
|
||||||
// initiated by the user resizing the window, we
|
// initiated by the user resizing the window, we
|
||||||
// enlarge the window to fit the video.
|
// enlarge the window to fit the video.
|
||||||
fIgnoreFrameResized = true;
|
fIgnoreFrameResized = true;
|
||||||
ResizeTo(scaled_width - 1, scaled_height - 1 + (fNoMenu ? 0 : fMenuBarHeight));
|
ResizeTo(scaled_width - 1, scaled_height - 1
|
||||||
|
+ (fNoMenu ? 0 : fMenuBarHeight));
|
||||||
// Sync();
|
// Sync();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -678,13 +792,15 @@ MainWin::AdjustWindowedRenderer(bool user_resized)
|
|||||||
int new_width = int(max_width);
|
int new_width = int(max_width);
|
||||||
int new_height = int(max_width / display_aspect_ratio + 0.5);
|
int new_height = int(max_width / display_aspect_ratio + 0.5);
|
||||||
|
|
||||||
printf("AdjustWindowedRenderer: old display %d x %d, src video %d x %d, "
|
printf("AdjustWindowedRenderer: old display %d x %d, src video "
|
||||||
"scaled video %.3f x %.3f, aspect ratio %.3f, new display %d x %d\n",
|
"%d x %d, scaled video %.3f x %.3f, aspect ratio %.3f, new "
|
||||||
int(max_width), int(max_height), fSourceWidth, fSourceHeight, scaled_width, scaled_height,
|
"display %d x %d\n", int(max_width), int(max_height),
|
||||||
display_aspect_ratio, new_width, new_height);
|
fSourceWidth, fSourceHeight, scaled_width, scaled_height,
|
||||||
|
display_aspect_ratio, new_width, new_height);
|
||||||
|
|
||||||
fIgnoreFrameResized = true;
|
fIgnoreFrameResized = true;
|
||||||
ResizeTo(new_width - 1, new_height - 1 + (fNoMenu ? 0 : fMenuBarHeight));
|
ResizeTo(new_width - 1, new_height - 1 + (fNoMenu ? 0
|
||||||
|
: fMenuBarHeight));
|
||||||
// Sync();
|
// Sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -716,7 +832,8 @@ MainWin::ToggleFullscreen()
|
|||||||
printf("ToggleFullscreen enter\n");
|
printf("ToggleFullscreen enter\n");
|
||||||
|
|
||||||
if (!fFrameResizedCalled) {
|
if (!fFrameResizedCalled) {
|
||||||
printf("ToggleFullscreen - ignoring, as FrameResized wasn't called since last switch\n");
|
printf("ToggleFullscreen - ignoring, as FrameResized wasn't called "
|
||||||
|
"since last switch\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fFrameResizedCalled = false;
|
fFrameResizedCalled = false;
|
||||||
@@ -731,7 +848,9 @@ MainWin::ToggleFullscreen()
|
|||||||
// Sync();
|
// Sync();
|
||||||
|
|
||||||
fSavedFrame = Frame();
|
fSavedFrame = Frame();
|
||||||
printf("saving current frame: %d %d %d %d\n", int(fSavedFrame.left), int(fSavedFrame.top), int(fSavedFrame.right), int(fSavedFrame.bottom));
|
printf("saving current frame: %d %d %d %d\n", int(fSavedFrame.left),
|
||||||
|
int(fSavedFrame.top), int(fSavedFrame.right),
|
||||||
|
int(fSavedFrame.bottom));
|
||||||
BScreen screen(this);
|
BScreen screen(this);
|
||||||
BRect rect(screen.Frame());
|
BRect rect(screen.Frame());
|
||||||
|
|
||||||
@@ -860,7 +979,8 @@ MainWin::KeyDown(BMessage *msg)
|
|||||||
uint32 raw_char = msg->FindInt32("raw_char");
|
uint32 raw_char = msg->FindInt32("raw_char");
|
||||||
uint32 modifiers = msg->FindInt32("modifiers");
|
uint32 modifiers = msg->FindInt32("modifiers");
|
||||||
|
|
||||||
printf("key 0x%lx, raw_char 0x%lx, modifiers 0x%lx\n", key, raw_char, modifiers);
|
printf("key 0x%lx, raw_char 0x%lx, modifiers 0x%lx\n", key, raw_char,
|
||||||
|
modifiers);
|
||||||
|
|
||||||
switch (raw_char) {
|
switch (raw_char) {
|
||||||
case B_SPACE:
|
case B_SPACE:
|
||||||
@@ -882,7 +1002,8 @@ MainWin::KeyDown(BMessage *msg)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case B_TAB:
|
case B_TAB:
|
||||||
if ((modifiers & (B_COMMAND_KEY | B_CONTROL_KEY | B_OPTION_KEY | B_MENU_KEY)) == 0) {
|
if ((modifiers & (B_COMMAND_KEY | B_CONTROL_KEY | B_OPTION_KEY
|
||||||
|
| B_MENU_KEY)) == 0) {
|
||||||
PostMessage(M_TOGGLE_FULLSCREEN);
|
PostMessage(M_TOGGLE_FULLSCREEN);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
} else
|
} else
|
||||||
@@ -974,14 +1095,18 @@ MainWin::KeyDown(BMessage *msg)
|
|||||||
void
|
void
|
||||||
MainWin::DispatchMessage(BMessage *msg, BHandler *handler)
|
MainWin::DispatchMessage(BMessage *msg, BHandler *handler)
|
||||||
{
|
{
|
||||||
if ((msg->what == B_MOUSE_DOWN) && (handler == fBackground || handler == fVideoView))
|
if ((msg->what == B_MOUSE_DOWN) && (handler == fBackground
|
||||||
|
|| handler == fVideoView))
|
||||||
MouseDown(msg);
|
MouseDown(msg);
|
||||||
if ((msg->what == B_MOUSE_MOVED) && (handler == fBackground || handler == fVideoView))
|
if ((msg->what == B_MOUSE_MOVED) && (handler == fBackground
|
||||||
|
|| handler == fVideoView))
|
||||||
MouseMoved(msg);
|
MouseMoved(msg);
|
||||||
if ((msg->what == B_MOUSE_UP) && (handler == fBackground || handler == fVideoView))
|
if ((msg->what == B_MOUSE_UP) && (handler == fBackground
|
||||||
|
|| handler == fVideoView))
|
||||||
MouseUp(msg);
|
MouseUp(msg);
|
||||||
|
|
||||||
if ((msg->what == B_KEY_DOWN) && (handler == fBackground || handler == fVideoView)) {
|
if ((msg->what == B_KEY_DOWN) && (handler == fBackground
|
||||||
|
|| handler == fVideoView)) {
|
||||||
|
|
||||||
// special case for PrintScreen key
|
// special case for PrintScreen key
|
||||||
if (msg->FindInt32("key") == B_PRINT_KEY) {
|
if (msg->FindInt32("key") == B_PRINT_KEY) {
|
||||||
@@ -1103,19 +1228,34 @@ MainWin::MessageReceived(BMessage *msg)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case M_FILE_ABOUT:
|
case M_FILE_ABOUT:
|
||||||
BAlert *alert;
|
{
|
||||||
alert = new BAlert("about", NAME"\n\n"
|
BString alertStr = fLocalizedName;
|
||||||
INFO1
|
alertStr << "\n\n";
|
||||||
#if TIME_BOMB_ACTIVE
|
alertStr << fLocalizedInfo1;
|
||||||
"\n\n" INFO2
|
#if TIME_BOMB_ACTIVE
|
||||||
#endif
|
alertStr << "\n\n";
|
||||||
"\n\nCopyright "COPYRIGHT"\nVersion "VERSION"\nRevision "REVISION"\nBuild "BUILD, "OK");
|
alertStr << INFO2;
|
||||||
if (fAlwaysOnTop) {
|
#endif
|
||||||
ToggleAlwaysOnTop();
|
alertStr << "\n\nCopyright ";
|
||||||
alert->Go();
|
alertStr << COPYRIGHT;
|
||||||
ToggleAlwaysOnTop();
|
alertStr << B_TRANSLATE("\nVersion ");
|
||||||
} else {
|
alertStr << VERSION;
|
||||||
alert->Go();
|
alertStr << B_TRANSLATE("\nRevision ");
|
||||||
|
if (strcmp(REVISION, "unknown") == 0)
|
||||||
|
alertStr << fLocalizedRevision;
|
||||||
|
else
|
||||||
|
alertStr << REVISION;
|
||||||
|
alertStr << B_TRANSLATE("\nBuild ");
|
||||||
|
alertStr << BUILD;
|
||||||
|
|
||||||
|
BAlert *alert;
|
||||||
|
alert = new BAlert("about", alertStr.String(), B_TRANSLATE("OK"));
|
||||||
|
if (fAlwaysOnTop) {
|
||||||
|
ToggleAlwaysOnTop();
|
||||||
|
alert->Go();
|
||||||
|
ToggleAlwaysOnTop();
|
||||||
|
} else
|
||||||
|
alert->Go();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1130,7 +1270,8 @@ MainWin::MessageReceived(BMessage *msg)
|
|||||||
ToggleFullscreen();
|
ToggleFullscreen();
|
||||||
}
|
}
|
||||||
ResizeTo(int(fSourceWidth * fWidthScale),
|
ResizeTo(int(fSourceWidth * fWidthScale),
|
||||||
int(fSourceHeight * fHeightScale) + (fNoMenu ? 0 : fMenuBarHeight));
|
int(fSourceHeight * fHeightScale) + (fNoMenu ? 0
|
||||||
|
: fMenuBarHeight));
|
||||||
// Sync();
|
// Sync();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1167,11 +1308,13 @@ MainWin::MessageReceived(BMessage *msg)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (msg->what >= M_SELECT_CHANNEL && msg->what <= M_SELECT_CHANNEL_END) {
|
if (msg->what >= M_SELECT_CHANNEL
|
||||||
|
&& msg->what <= M_SELECT_CHANNEL_END) {
|
||||||
SelectChannel(msg->what - M_SELECT_CHANNEL);
|
SelectChannel(msg->what - M_SELECT_CHANNEL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (msg->what >= M_SELECT_INTERFACE && msg->what <= M_SELECT_INTERFACE_END) {
|
if (msg->what >= M_SELECT_INTERFACE
|
||||||
|
&& msg->what <= M_SELECT_INTERFACE_END) {
|
||||||
SelectInterface(msg->what - M_SELECT_INTERFACE - 1);
|
SelectInterface(msg->what - M_SELECT_INTERFACE - 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,10 +25,13 @@
|
|||||||
#ifndef __MAIN_WIN_H
|
#ifndef __MAIN_WIN_H
|
||||||
#define __MAIN_WIN_H
|
#define __MAIN_WIN_H
|
||||||
|
|
||||||
#include <Window.h>
|
|
||||||
#include <Menu.h>
|
|
||||||
#include <Button.h>
|
#include <Button.h>
|
||||||
|
#include <Catalog.h>
|
||||||
|
#include <Locale.h>
|
||||||
|
#include <Menu.h>
|
||||||
#include <Slider.h>
|
#include <Slider.h>
|
||||||
|
#include <Window.h>
|
||||||
|
|
||||||
#include "Controller.h"
|
#include "Controller.h"
|
||||||
#include "VideoView.h"
|
#include "VideoView.h"
|
||||||
|
|
||||||
|
|||||||
+33
-15
@@ -37,14 +37,16 @@
|
|||||||
#include "VideoView.h"
|
#include "VideoView.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
overlay_copy(uint32 lines, void *dst, uint32 dst_bpr, const void *src, uint32 src_bpr)
|
overlay_copy(uint32 lines, void *dst, uint32 dst_bpr, const void *src,
|
||||||
|
uint32 src_bpr)
|
||||||
{
|
{
|
||||||
// bigtime_t start = system_time();
|
// bigtime_t start = system_time();
|
||||||
int len = min_c(dst_bpr, src_bpr);
|
int len = min_c(dst_bpr, src_bpr);
|
||||||
// int len4 = len / 4;
|
// int len4 = len / 4;
|
||||||
while (lines--) {
|
while (lines--) {
|
||||||
/*
|
/*
|
||||||
// this does not copy the last few bytes, if length is not aligned to 4 bytes
|
// this does not copy the last few bytes, if length is not aligned
|
||||||
|
// to 4 bytes
|
||||||
asm ("rep\n\t""movsl"
|
asm ("rep\n\t""movsl"
|
||||||
:
|
:
|
||||||
: "c" (len4), "S" (src), "D" (dst)
|
: "c" (len4), "S" (src), "D" (dst)
|
||||||
@@ -161,6 +163,10 @@ VideoNode:: HandleMessage(int32 message,
|
|||||||
const void *data,
|
const void *data,
|
||||||
size_t size)
|
size_t size)
|
||||||
{
|
{
|
||||||
|
if (BBufferConsumer::HandleMessage(message, data, size) == B_OK
|
||||||
|
|| BMediaEventLooper::HandleMessage(message, data, size) == B_OK)
|
||||||
|
return B_OK;
|
||||||
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,7 +180,9 @@ VideoNode::HandleEvent(const media_timed_event *event,
|
|||||||
case BTimedEventQueue::B_START:
|
case BTimedEventQueue::B_START:
|
||||||
break;
|
break;
|
||||||
case BTimedEventQueue::B_STOP:
|
case BTimedEventQueue::B_STOP:
|
||||||
EventQueue()->FlushEvents(event->event_time, BTimedEventQueue::B_ALWAYS, true, BTimedEventQueue::B_HANDLE_BUFFER);
|
EventQueue()->FlushEvents(event->event_time,
|
||||||
|
BTimedEventQueue::B_ALWAYS, true,
|
||||||
|
BTimedEventQueue::B_HANDLE_BUFFER);
|
||||||
break;
|
break;
|
||||||
case BTimedEventQueue::B_HANDLE_BUFFER:
|
case BTimedEventQueue::B_HANDLE_BUFFER:
|
||||||
HandleBuffer((BBuffer *)event->pointer);
|
HandleBuffer((BBuffer *)event->pointer);
|
||||||
@@ -182,7 +190,7 @@ VideoNode::HandleEvent(const media_timed_event *event,
|
|||||||
default:
|
default:
|
||||||
printf("VideoNode::HandleEvent unknown event");
|
printf("VideoNode::HandleEvent unknown event");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -258,13 +266,15 @@ VideoNode::Connected(const media_source &src,
|
|||||||
fInput.format.u.raw_video.field_rate = 25.0;
|
fInput.format.u.raw_video.field_rate = 25.0;
|
||||||
|
|
||||||
color_space colorspace = format.u.raw_video.display.format;
|
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);
|
BRect frame(0, 0, format.u.raw_video.display.line_width - 1,
|
||||||
|
format.u.raw_video.display.line_count - 1);
|
||||||
status_t err;
|
status_t err;
|
||||||
|
|
||||||
DeleteBuffers();
|
DeleteBuffers();
|
||||||
err = CreateBuffers(frame, colorspace, fOverlayEnabled);
|
err = CreateBuffers(frame, colorspace, fOverlayEnabled);
|
||||||
if (err) {
|
if (err) {
|
||||||
printf("VideoNode::Connected failed, fOverlayEnabled = %d\n", fOverlayEnabled);
|
printf("VideoNode::Connected failed, fOverlayEnabled = %d\n",
|
||||||
|
fOverlayEnabled);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,7 +314,8 @@ VideoNode::FormatChanged(const media_source &src,
|
|||||||
return B_MEDIA_BAD_DESTINATION;
|
return B_MEDIA_BAD_DESTINATION;
|
||||||
|
|
||||||
color_space colorspace = format.u.raw_video.display.format;
|
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);
|
BRect frame(0, 0, format.u.raw_video.display.line_width - 1,
|
||||||
|
format.u.raw_video.display.line_count - 1);
|
||||||
status_t err;
|
status_t err;
|
||||||
|
|
||||||
DeleteBuffers();
|
DeleteBuffers();
|
||||||
@@ -312,7 +323,8 @@ VideoNode::FormatChanged(const media_source &src,
|
|||||||
fVideoView->RemoveOverlay();
|
fVideoView->RemoveOverlay();
|
||||||
err = CreateBuffers(frame, colorspace, true); // try overlay
|
err = CreateBuffers(frame, colorspace, true); // try overlay
|
||||||
if (err) {
|
if (err) {
|
||||||
printf("VideoNode::FormatChanged creating overlay buffer failed\n");
|
printf("VideoNode::FormatChanged creating overlay buffer "
|
||||||
|
"failed\n");
|
||||||
err = CreateBuffers(frame, colorspace, false); // no overlay
|
err = CreateBuffers(frame, colorspace, false); // no overlay
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -343,11 +355,13 @@ VideoNode::HandleBuffer(BBuffer *buffer)
|
|||||||
|
|
||||||
// memcpy(fBitmap->Bits(), buffer->Data(), fBitmap->BitsLength());
|
// memcpy(fBitmap->Bits(), buffer->Data(), fBitmap->BitsLength());
|
||||||
|
|
||||||
// fBitmap->SetBits(buffer->Data(), fBitmap->BitsLength(), 0, fInput.format.u.raw_video.display.format);
|
// fBitmap->SetBits(buffer->Data(), fBitmap->BitsLength(), 0,
|
||||||
|
// fInput.format.u.raw_video.display.format);
|
||||||
|
|
||||||
overlay_copy(fBitmap->Bounds().IntegerHeight() + 1,
|
overlay_copy(fBitmap->Bounds().IntegerHeight() + 1,
|
||||||
fBitmap->Bits(), fBitmap->BytesPerRow(),
|
fBitmap->Bits(), fBitmap->BytesPerRow(),
|
||||||
buffer->Data(), fInput.format.u.raw_video.display.bytes_per_row);
|
buffer->Data(),
|
||||||
|
fInput.format.u.raw_video.display.bytes_per_row);
|
||||||
|
|
||||||
|
|
||||||
fBitmap->UnlockBits();
|
fBitmap->UnlockBits();
|
||||||
@@ -357,7 +371,8 @@ VideoNode::HandleBuffer(BBuffer *buffer)
|
|||||||
|
|
||||||
overlay_copy(fBitmap->Bounds().IntegerHeight() + 1,
|
overlay_copy(fBitmap->Bounds().IntegerHeight() + 1,
|
||||||
fBitmap->Bits(), fBitmap->BytesPerRow(),
|
fBitmap->Bits(), fBitmap->BytesPerRow(),
|
||||||
buffer->Data(), fInput.format.u.raw_video.display.bytes_per_row);
|
buffer->Data(),
|
||||||
|
fInput.format.u.raw_video.display.bytes_per_row);
|
||||||
}
|
}
|
||||||
// printf("overlay copy: %Ld usec\n", system_time() - start);
|
// printf("overlay copy: %Ld usec\n", system_time() - start);
|
||||||
}
|
}
|
||||||
@@ -407,8 +422,9 @@ VideoNode::IsOverlayActive()
|
|||||||
status_t
|
status_t
|
||||||
VideoNode::CreateBuffers(BRect frame, color_space cspace, bool overlay)
|
VideoNode::CreateBuffers(BRect frame, color_space cspace, bool overlay)
|
||||||
{
|
{
|
||||||
printf("VideoNode::CreateBuffers: frame %d,%d,%d,%d colorspace 0x%08x, overlay %d\n",
|
printf("VideoNode::CreateBuffers: frame %d,%d,%d,%d colorspace 0x%08x, "
|
||||||
int(frame.left), int(frame.top), int(frame.right), int(frame.bottom), int(cspace), overlay);
|
"overlay %d\n", int(frame.left), int(frame.top), int(frame.right),
|
||||||
|
int(frame.bottom), int(cspace), overlay);
|
||||||
|
|
||||||
// int32 bytesPerRow = B_ANY_BYTES_PER_ROW;
|
// int32 bytesPerRow = B_ANY_BYTES_PER_ROW;
|
||||||
// if (cspace == B_YCbCr422)
|
// if (cspace == B_YCbCr422)
|
||||||
@@ -418,7 +434,8 @@ VideoNode::CreateBuffers(BRect frame, color_space cspace, bool overlay)
|
|||||||
|
|
||||||
LockBitmap();
|
LockBitmap();
|
||||||
ASSERT(fBitmap == 0);
|
ASSERT(fBitmap == 0);
|
||||||
uint32 flags = overlay ? (B_BITMAP_WILL_OVERLAY | B_BITMAP_RESERVE_OVERLAY_CHANNEL) : 0;
|
uint32 flags = overlay ? (B_BITMAP_WILL_OVERLAY
|
||||||
|
| B_BITMAP_RESERVE_OVERLAY_CHANNEL) : 0;
|
||||||
// fBitmap = new BBitmap(frame, flags, cspace, bytesPerRow);
|
// fBitmap = new BBitmap(frame, flags, cspace, bytesPerRow);
|
||||||
fBitmap = new BBitmap(frame, flags, cspace);
|
fBitmap = new BBitmap(frame, flags, cspace);
|
||||||
if (!(fBitmap && fBitmap->InitCheck() == B_OK && fBitmap->IsValid())) {
|
if (!(fBitmap && fBitmap->InitCheck() == B_OK && fBitmap->IsValid())) {
|
||||||
@@ -429,7 +446,8 @@ VideoNode::CreateBuffers(BRect frame, color_space cspace, bool overlay)
|
|||||||
printf("VideoNode::CreateBuffers failed\n");
|
printf("VideoNode::CreateBuffers failed\n");
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
printf("overlay bitmap: got: bytes per row: %ld\n", fBitmap->BytesPerRow());
|
printf("overlay bitmap: got: bytes per row: %ld\n",
|
||||||
|
fBitmap->BytesPerRow());
|
||||||
fOverlayActive = overlay;
|
fOverlayActive = overlay;
|
||||||
UnlockBitmap();
|
UnlockBitmap();
|
||||||
printf("VideoNode::CreateBuffers success\n");
|
printf("VideoNode::CreateBuffers success\n");
|
||||||
|
|||||||
+58
-28
@@ -35,7 +35,8 @@
|
|||||||
|
|
||||||
#define CHECK_ACTIVITY 'ChkA'
|
#define CHECK_ACTIVITY 'ChkA'
|
||||||
|
|
||||||
VideoView::VideoView(BRect frame, const char *name, uint32 resizeMask, uint32 flags)
|
VideoView::VideoView(BRect frame, const char *name, uint32 resizeMask,
|
||||||
|
uint32 flags)
|
||||||
: BView(frame, name, resizeMask, flags)
|
: BView(frame, name, resizeMask, flags)
|
||||||
, fVideoNode(0)
|
, fVideoNode(0)
|
||||||
, fVideoActive(false)
|
, fVideoActive(false)
|
||||||
@@ -72,7 +73,8 @@ void
|
|||||||
VideoView::AttachedToWindow()
|
VideoView::AttachedToWindow()
|
||||||
{
|
{
|
||||||
BMessage msg(CHECK_ACTIVITY);
|
BMessage msg(CHECK_ACTIVITY);
|
||||||
fActivityCheckMsgRunner = new BMessageRunner(BMessenger(this), &msg, 200000);
|
fActivityCheckMsgRunner = new BMessageRunner(BMessenger(this), &msg,
|
||||||
|
200000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -93,7 +95,8 @@ VideoView::OverlayLockAcquire()
|
|||||||
void
|
void
|
||||||
VideoView::OverlayLockRelease()
|
VideoView::OverlayLockRelease()
|
||||||
{ /* [19:54] <Francois> Rudolf forwarded me a mail once about it
|
{ /* [19:54] <Francois> Rudolf forwarded me a mail once about it
|
||||||
* [19:55] <Francois> when you get relmease msg you are supposed to UnlockBits() on the overlay bitmaps you use
|
* [19:55] <Francois> when you get relmease msg you are supposed to
|
||||||
|
UnlockBits() on the overlay bitmaps you use
|
||||||
* [19:55] <Francois> it's used when switching workspaces
|
* [19:55] <Francois> it's used when switching workspaces
|
||||||
* [19:55] <Francois> as the bits might get relocated
|
* [19:55] <Francois> as the bits might get relocated
|
||||||
*/
|
*/
|
||||||
@@ -139,7 +142,8 @@ VideoView::OverlayScreenshotCleanup()
|
|||||||
if (bmp) {
|
if (bmp) {
|
||||||
DrawBitmap(bmp, Bounds());
|
DrawBitmap(bmp, Bounds());
|
||||||
SetViewOverlay(bmp, bmp->Bounds(), Bounds(), &fOverlayKeyColor,
|
SetViewOverlay(bmp, bmp->Bounds(), Bounds(), &fOverlayKeyColor,
|
||||||
B_FOLLOW_ALL, B_OVERLAY_FILTER_HORIZONTAL | B_OVERLAY_FILTER_VERTICAL);
|
B_FOLLOW_ALL, B_OVERLAY_FILTER_HORIZONTAL
|
||||||
|
| B_OVERLAY_FILTER_VERTICAL);
|
||||||
Invalidate();
|
Invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -231,7 +235,8 @@ VideoView::DrawFrame()
|
|||||||
UnlockLooper();
|
UnlockLooper();
|
||||||
fOverlayActive = false;
|
fOverlayActive = false;
|
||||||
} else {
|
} else {
|
||||||
printf("can't ClearViewOverlay, as LockLooperWithTimeout failed\n");
|
printf("can't ClearViewOverlay, as LockLooperWithTimeout "
|
||||||
|
"failed\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (want_overlay && !fOverlayActive) {
|
if (want_overlay && !fOverlayActive) {
|
||||||
@@ -239,7 +244,8 @@ VideoView::DrawFrame()
|
|||||||
BBitmap *bmp = fVideoNode->Bitmap();
|
BBitmap *bmp = fVideoNode->Bitmap();
|
||||||
if (bmp && LockLooperWithTimeout(50000) == B_OK) {
|
if (bmp && LockLooperWithTimeout(50000) == B_OK) {
|
||||||
SetViewOverlay(bmp, bmp->Bounds(), Bounds(), &fOverlayKeyColor,
|
SetViewOverlay(bmp, bmp->Bounds(), Bounds(), &fOverlayKeyColor,
|
||||||
B_FOLLOW_ALL, B_OVERLAY_FILTER_HORIZONTAL | B_OVERLAY_FILTER_VERTICAL);
|
B_FOLLOW_ALL, B_OVERLAY_FILTER_HORIZONTAL
|
||||||
|
| B_OVERLAY_FILTER_VERTICAL);
|
||||||
fOverlayActive = true;
|
fOverlayActive = true;
|
||||||
|
|
||||||
Invalidate();
|
Invalidate();
|
||||||
@@ -363,31 +369,55 @@ VideoView::IsOverlaySupported()
|
|||||||
|
|
||||||
bool supported = false;
|
bool supported = false;
|
||||||
for (int i = 0; colspace[i].name; i++) {
|
for (int i = 0; colspace[i].name; i++) {
|
||||||
BBitmap *test = new BBitmap(BRect(0,0,320,240), B_BITMAP_WILL_OVERLAY | B_BITMAP_RESERVE_OVERLAY_CHANNEL, colspace[i].colspace);
|
BBitmap *test = new BBitmap(BRect(0,0,320,240), B_BITMAP_WILL_OVERLAY
|
||||||
|
| B_BITMAP_RESERVE_OVERLAY_CHANNEL, colspace[i].colspace);
|
||||||
if (test->InitCheck() == B_OK) {
|
if (test->InitCheck() == B_OK) {
|
||||||
printf("Display supports %s (0x%08x) overlay\n", colspace[i].name, colspace[i].colspace);
|
printf("Display supports %s (0x%08x) overlay\n", colspace[i].name,
|
||||||
|
colspace[i].colspace);
|
||||||
overlay_restrictions restrict;
|
overlay_restrictions restrict;
|
||||||
if (B_OK == test->GetOverlayRestrictions(&restrict)) {
|
if (B_OK == test->GetOverlayRestrictions(&restrict)) {
|
||||||
printf("Overlay restrictions: source horizontal_alignment %d\n", restrict.source.horizontal_alignment);
|
printf(
|
||||||
printf("Overlay restrictions: source vertical_alignment %d\n", restrict.source.vertical_alignment);
|
"Overlay restrictions: source horizontal_alignment %d\n",
|
||||||
printf("Overlay restrictions: source width_alignment %d\n", restrict.source.width_alignment);
|
restrict.source.horizontal_alignment);
|
||||||
printf("Overlay restrictions: source height_alignment %d\n", restrict.source.height_alignment);
|
printf("Overlay restrictions: source vertical_alignment %d\n",
|
||||||
printf("Overlay restrictions: source min_width %d\n", restrict.source.min_width);
|
restrict.source.vertical_alignment);
|
||||||
printf("Overlay restrictions: source max_width %d\n", restrict.source.max_width);
|
printf("Overlay restrictions: source width_alignment %d\n",
|
||||||
printf("Overlay restrictions: source min_height %d\n", restrict.source.min_height);
|
restrict.source.width_alignment);
|
||||||
printf("Overlay restrictions: source max_height %d\n", restrict.source.max_height);
|
printf("Overlay restrictions: source height_alignment %d\n",
|
||||||
printf("Overlay restrictions: destination horizontal_alignment %d\n", restrict.destination.horizontal_alignment);
|
restrict.source.height_alignment);
|
||||||
printf("Overlay restrictions: destination vertical_alignment %d\n", restrict.destination.vertical_alignment);
|
printf("Overlay restrictions: source min_width %d\n",
|
||||||
printf("Overlay restrictions: destination width_alignment %d\n", restrict.destination.width_alignment);
|
restrict.source.min_width);
|
||||||
printf("Overlay restrictions: destination height_alignment %d\n", restrict.destination.height_alignment);
|
printf("Overlay restrictions: source max_width %d\n",
|
||||||
printf("Overlay restrictions: destination min_width %d\n", restrict.destination.min_width);
|
restrict.source.max_width);
|
||||||
printf("Overlay restrictions: destination max_width %d\n", restrict.destination.max_width);
|
printf("Overlay restrictions: source min_height %d\n",
|
||||||
printf("Overlay restrictions: destination min_height %d\n", restrict.destination.min_height);
|
restrict.source.min_height);
|
||||||
printf("Overlay restrictions: destination max_height %d\n", restrict.destination.max_height);
|
printf("Overlay restrictions: source max_height %d\n",
|
||||||
printf("Overlay restrictions: min_width_scale %.3f\n", restrict.min_width_scale);
|
restrict.source.max_height);
|
||||||
printf("Overlay restrictions: max_width_scale %.3f\n", restrict.max_width_scale);
|
printf(
|
||||||
printf("Overlay restrictions: min_height_scale %.3f\n", restrict.min_height_scale);
|
"Overlay restrictions: destination horizontal_alignment "
|
||||||
printf("Overlay restrictions: max_height_scale %.3f\n", restrict.max_height_scale);
|
"%d\n", restrict.destination.horizontal_alignment);
|
||||||
|
printf("Overlay restrictions: destination vertical_alignment "
|
||||||
|
"%d\n", restrict.destination.vertical_alignment);
|
||||||
|
printf("Overlay restrictions: destination width_alignment "
|
||||||
|
"%d\n", restrict.destination.width_alignment);
|
||||||
|
printf("Overlay restrictions: destination height_alignment "
|
||||||
|
"%d\n", restrict.destination.height_alignment);
|
||||||
|
printf("Overlay restrictions: destination min_width %d\n",
|
||||||
|
restrict.destination.min_width);
|
||||||
|
printf("Overlay restrictions: destination max_width %d\n",
|
||||||
|
restrict.destination.max_width);
|
||||||
|
printf("Overlay restrictions: destination min_height %d\n",
|
||||||
|
restrict.destination.min_height);
|
||||||
|
printf("Overlay restrictions: destination max_height %d\n",
|
||||||
|
restrict.destination.max_height);
|
||||||
|
printf("Overlay restrictions: min_width_scale %.3f\n",
|
||||||
|
restrict.min_width_scale);
|
||||||
|
printf("Overlay restrictions: max_width_scale %.3f\n",
|
||||||
|
restrict.max_width_scale);
|
||||||
|
printf("Overlay restrictions: min_height_scale %.3f\n",
|
||||||
|
restrict.min_height_scale);
|
||||||
|
printf("Overlay restrictions: max_height_scale %.3f\n",
|
||||||
|
restrict.max_height_scale);
|
||||||
}
|
}
|
||||||
supported = true;
|
supported = true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user