]> git.sesse.net Git - nageru/blob - decklink_util.cpp
Add a flag to output Y'CbCr using Rec. 709 coefficients.
[nageru] / decklink_util.cpp
1 #include <DeckLinkAPI.h>
2 #include <DeckLinkAPIModes.h>
3
4 #include "decklink_util.h"
5
6 using namespace bmusb;
7 using namespace std;
8
9 map<uint32_t, VideoMode> summarize_video_modes(IDeckLinkDisplayModeIterator *mode_it, unsigned card_index)
10 {
11         map<uint32_t, VideoMode> video_modes;
12
13         for (IDeckLinkDisplayMode *mode_ptr; mode_it->Next(&mode_ptr) == S_OK; mode_ptr->Release()) {
14                 VideoMode mode;
15
16                 const char *mode_name;
17                 if (mode_ptr->GetName(&mode_name) != S_OK) {
18                         mode.name = "Unknown mode";
19                 } else {
20                         mode.name = mode_name;
21                 }
22
23                 mode.autodetect = false;
24
25                 mode.width = mode_ptr->GetWidth();
26                 mode.height = mode_ptr->GetHeight();
27
28                 BMDTimeScale frame_rate_num;
29                 BMDTimeValue frame_rate_den;
30                 if (mode_ptr->GetFrameRate(&frame_rate_den, &frame_rate_num) != S_OK) {
31                         fprintf(stderr, "Could not get frame rate for mode '%s' on card %d\n", mode.name.c_str(), card_index);
32                         exit(1);
33                 }
34                 mode.frame_rate_num = frame_rate_num;
35                 mode.frame_rate_den = frame_rate_den;
36
37                 // TODO: Respect the TFF/BFF flag.
38                 mode.interlaced = (mode_ptr->GetFieldDominance() == bmdLowerFieldFirst || mode_ptr->GetFieldDominance() == bmdUpperFieldFirst);
39
40                 uint32_t id = mode_ptr->GetDisplayMode();
41                 video_modes.insert(make_pair(id, mode));
42         }
43
44         return video_modes;
45 }