+ Frame frame;
+ Eyes eyes = Eyes::BOTH;
+ if (!_position) {
+ /* This is the first data we have received since initialisation or seek. Set
+ the position based on the frame that was given. After this first time
+ we just count frames, since (as with audio) it seems that ContentTimes
+ are unreliable from FFmpegDecoder. They are much better than audio times
+ but still we get the occasional one which is duplicated. In this case
+ ffmpeg seems to carry on regardless, processing the video frame as normal.
+ If we drop the frame with the duplicated timestamp we obviously lose sync.
+ */
+
+ if (vft == VideoFrameType::THREE_D_ALTERNATE) {
+ frame = decoder_frame / 2;
+ eyes = (decoder_frame % 2) ? Eyes::RIGHT : Eyes::LEFT;
+ } else {
+ frame = decoder_frame;
+ if (vft == VideoFrameType::THREE_D) {
+ auto j2k = dynamic_pointer_cast<const J2KImageProxy>(image);
+ /* At the moment only DCP decoders producers VideoFrameType::THREE_D, so only the J2KImageProxy
+ * knows which eye it is.
+ */
+ if (j2k && j2k->eye()) {
+ eyes = j2k->eye().get() == dcp::Eye::LEFT ? Eyes::LEFT : Eyes::RIGHT;
+ }
+ }
+ }