[vlc-commits] decklink: simplify Open
Rafaël Carré
git at videolan.org
Thu Dec 13 16:57:07 CET 2012
vlc | branch: master | Rafaël Carré <funman at videolan.org> | Wed Dec 12 00:20:50 2012 +0100| [260dc9659ebc6770cbdffe0da09beb1137e73beb] | committer: Rafaël Carré
decklink: simplify Open
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=260dc9659ebc6770cbdffe0da09beb1137e73beb
---
modules/access/decklink.cpp | 154 ++++++++++++++++++-------------------------
1 file changed, 64 insertions(+), 90 deletions(-)
diff --git a/modules/access/decklink.cpp b/modules/access/decklink.cpp
index 1ce7ec3..4dcbe8c 100644
--- a/modules/access/decklink.cpp
+++ b/modules/access/decklink.cpp
@@ -314,16 +314,33 @@ static int GetVideoConn(demux_t *demux)
return VLC_SUCCESS;
}
+static const char *GetFieldDominance(BMDFieldDominance dom, uint32_t *flags)
+{
+ switch(dom)
+ {
+ case bmdProgressiveFrame:
+ return "";
+ case bmdProgressiveSegmentedFrame:
+ return ", segmented";
+ case bmdLowerFieldFirst:
+ *flags = BLOCK_FLAG_BOTTOM_FIELD_FIRST;
+ return ", interlaced [BFF]";
+ case bmdUpperFieldFirst:
+ *flags = BLOCK_FLAG_TOP_FIELD_FIRST;
+ return ", interlaced [TFF]";
+ case bmdUnknownFieldDominance:
+ default:
+ return ", unknown field dominance";
+ }
+}
static int Open(vlc_object_t *p_this)
{
demux_t *demux = (demux_t*)p_this;
demux_sys_t *sys;
int ret = VLC_EGENERIC;
- char *display_mode = NULL;
- bool b_found_mode;
int card_index;
- int width, height, fps_num, fps_den;
+ int width = 0, height, fps_num, fps_den;
int rate;
unsigned aspect_num, aspect_den;
@@ -343,8 +360,6 @@ static int Open(vlc_object_t *p_this)
vlc_mutex_init(&sys->pts_lock);
- IDeckLinkDisplayModeIterator *display_iterator = NULL;
-
IDeckLinkIterator *decklink_iterator = CreateDeckLinkIteratorInstance();
if (!decklink_iterator) {
msg_Err(demux, "DeckLink drivers not found.");
@@ -367,10 +382,8 @@ static int Open(vlc_object_t *p_this)
}
const char *model_name;
- if (sys->card->GetModelName(&model_name) != S_OK) {
- msg_Err(demux, "Could not get model name");
- goto finish;
- }
+ if (sys->card->GetModelName(&model_name) != S_OK)
+ model_name = "unknown";
msg_Dbg(demux, "Opened DeckLink PCI card %d (%s)", card_index, model_name);
@@ -388,103 +401,69 @@ static int Open(vlc_object_t *p_this)
if (GetVideoConn(demux) || GetAudioConn(demux))
goto finish;
- /* Get the list of display modes. */
- if (sys->input->GetDisplayModeIterator(&display_iterator) != S_OK) {
- msg_Err(demux, "Failed to enumerate display modes");
+ char *mode;
+ mode = var_CreateGetNonEmptyString(demux, "decklink-mode");
+ if (!mode || strlen(mode) < 3 || strlen(mode) > 4) {
+ msg_Err(demux, "Invalid mode: `%s\'", mode ? mode : "");
goto finish;
}
- display_mode = var_CreateGetNonEmptyString(demux, "decklink-mode");
- if (!display_mode || strlen(display_mode) > 4) {
- msg_Err(demux, "Missing or invalid --decklink-mode string");
+ /* Get the list of display modes. */
+ IDeckLinkDisplayModeIterator *mode_it;
+ if (sys->input->GetDisplayModeIterator(&mode_it) != S_OK) {
+ msg_Err(demux, "Failed to enumerate display modes");
+ free(mode);
goto finish;
}
- /*
- * Pad the --decklink-mode string to four characters, so the user can specify e.g. "pal"
- * without having to add the trailing space.
- */
- char sz_display_mode_padded[5];
- strcpy(sz_display_mode_padded, " ");
- for (unsigned i = 0; i < strlen(display_mode); ++i)
- sz_display_mode_padded[i] = display_mode[i];
-
- BMDDisplayMode wanted_mode_id;
- memcpy(&wanted_mode_id, &sz_display_mode_padded, sizeof(wanted_mode_id));
-
- b_found_mode = false;
-
- for (;;) {
- IDeckLinkDisplayMode *display_mode;
- if ((display_iterator->Next(&display_mode) != S_OK) || !display_mode)
+ union {
+ BMDDisplayMode id;
+ char str[4];
+ } u;
+ memcpy(u.str, mode, 4);
+ if (u.str[3] == '\0')
+ u.str[3] = ' '; /* 'pal'\0 -> 'pal ' */
+ free(mode);
+
+ for (IDeckLinkDisplayMode *m;; m->Release()) {
+ if ((mode_it->Next(&m) != S_OK) || !m)
break;
- char sz_mode_id_text[5] = {0};
- BMDDisplayMode mode_id = ntohl(display_mode->GetDisplayMode());
- memcpy(sz_mode_id_text, &mode_id, sizeof(mode_id));
-
const char *mode_name;
- if (display_mode->GetName(&mode_name) != S_OK) {
- msg_Err(demux, "Failed to get display mode name");
- display_mode->Release();
- goto finish;
- }
-
BMDTimeValue frame_duration, time_scale;
- if (display_mode->GetFrameRate(&frame_duration, &time_scale) != S_OK) {
- msg_Err(demux, "Failed to get frame rate");
- display_mode->Release();
- goto finish;
+ uint32_t flags = 0;
+ const char *field = GetFieldDominance(m->GetFieldDominance(), &flags);
+ BMDDisplayMode id = ntohl(m->GetDisplayMode());
+
+ if (m->GetName(&mode_name) != S_OK)
+ mode_name = "unknown";
+ if (m->GetFrameRate(&frame_duration, &time_scale) != S_OK) {
+ time_scale = 0;
+ frame_duration = 1;
}
- const char *field_dominance;
- uint32_t dominance_flags = 0;
- switch(display_mode->GetFieldDominance())
- {
- case bmdProgressiveFrame:
- field_dominance = "";
- break;
- case bmdProgressiveSegmentedFrame:
- field_dominance = ", segmented";
- break;
- case bmdLowerFieldFirst:
- field_dominance = ", interlaced [BFF]";
- dominance_flags = BLOCK_FLAG_BOTTOM_FIELD_FIRST;
- break;
- case bmdUpperFieldFirst:
- field_dominance = ", interlaced [TFF]";
- dominance_flags = BLOCK_FLAG_TOP_FIELD_FIRST;
- break;
- case bmdUnknownFieldDominance:
- default:
- field_dominance = ", unknown field dominance";
- break;
- }
+ msg_Dbg(demux, "Found mode '%4.4s': %s (%dx%d, %.3f fps%s)",
+ (char*)&id, mode_name,
+ (int)m->GetWidth(), (int)m->GetHeight(),
+ double(time_scale) / frame_duration, field);
- msg_Dbg(demux, "Found mode '%s': %s (%dx%d, %.3f fps%s)",
- sz_mode_id_text, mode_name,
- (int)display_mode->GetWidth(), (int)display_mode->GetHeight(),
- double(time_scale) / frame_duration, field_dominance);
-
- if (wanted_mode_id == mode_id) {
- b_found_mode = true;
- width = display_mode->GetWidth();
- height = display_mode->GetHeight();
+ if (u.id == id) {
+ width = m->GetWidth();
+ height = m->GetHeight();
fps_num = time_scale;
fps_den = frame_duration;
- sys->dominance_flags = dominance_flags;
+ sys->dominance_flags = flags;
}
-
- display_mode->Release();
}
- if (!b_found_mode) {
- msg_Err(demux, "Unknown video mode specified. "
- "Run VLC with -vv to get a list of supported modes.");
+ mode_it->Release();
+
+ if (width == 0) {
+ msg_Err(demux, "Unknown video mode `%4.4s\' specified.", (char*)&u.id);
goto finish;
}
- if (sys->input->EnableVideoInput(htonl(wanted_mode_id), bmdFormat8BitYUV, 0) != S_OK) {
+ if (sys->input->EnableVideoInput(htonl(u.id), bmdFormat8BitYUV, 0) != S_OK) {
msg_Err(demux, "Failed to enable video input");
goto finish;
}
@@ -547,11 +526,6 @@ finish:
if (decklink_iterator)
decklink_iterator->Release();
- free(display_mode);
-
- if (display_iterator)
- display_iterator->Release();
-
if (ret != VLC_SUCCESS)
Close(p_this);
More information about the vlc-commits
mailing list