15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/*
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004 Google Inc.
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met:
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer.
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer in the documentation
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     and/or other materials provided with the distribution.
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  3. The name of the author may not be used to endorse or promote products
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     derived from this software without specific prior written permission.
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <stdio.h>
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string>
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <vector>
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/gunit.h"
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/logging.h"
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/thread.h"
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/testutils.h"
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/devices/filevideocapturer.h"
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace {
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass FileVideoCapturerTest : public testing::Test {
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void SetUp() {
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    capturer_.reset(new cricket::FileVideoCapturer);
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool OpenFile(const std::string& filename) {
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return capturer_->Init(cricket::GetTestFilePath(filename));
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected:
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  class VideoCapturerListener : public sigslot::has_slots<> {
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org   public:
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    VideoCapturerListener()
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        : frame_count_(0),
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          frame_width_(0),
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          frame_height_(0),
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          resolution_changed_(false) {
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    void OnFrameCaptured(cricket::VideoCapturer* capturer,
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                         const cricket::CapturedFrame* frame) {
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ++frame_count_;
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (1 == frame_count_) {
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        frame_width_ = frame->width;
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        frame_height_ = frame->height;
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      } else if (frame_width_ != frame->width ||
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          frame_height_ != frame->height) {
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        resolution_changed_ = true;
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int frame_count() const { return frame_count_; }
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int frame_width() const { return frame_width_; }
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int frame_height() const { return frame_height_; }
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    bool resolution_changed() const { return resolution_changed_; }
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org   private:
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int frame_count_;
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int frame_width_;
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int frame_height_;
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    bool resolution_changed_;
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  };
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<cricket::FileVideoCapturer> capturer_;
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  cricket::VideoFormat capture_format_;
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(FileVideoCapturerTest, TestNotOpened) {
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("", capturer_->GetId());
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(capturer_->GetSupportedFormats()->empty());
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(NULL, capturer_->GetCaptureFormat());
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(capturer_->IsRunning());
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(FileVideoCapturerTest, TestInvalidOpen) {
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(OpenFile("NotmeNotme"));
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(FileVideoCapturerTest, TestOpen) {
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(OpenFile("captured-320x240-2s-48.frames"));
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_NE("", capturer_->GetId());
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(NULL != capturer_->GetSupportedFormats());
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(1U, capturer_->GetSupportedFormats()->size());
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(NULL, capturer_->GetCaptureFormat());  // not started yet
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(capturer_->IsRunning());
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(FileVideoCapturerTest, TestLargeSmallDesiredFormat) {
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(OpenFile("captured-320x240-2s-48.frames"));
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // desired format with large resolution.
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  cricket::VideoFormat desired(
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      3200, 2400, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_ANY);
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &capture_format_));
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(320, capture_format_.width);
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(240, capture_format_.height);
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Desired format with small resolution.
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  desired.width = 0;
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  desired.height = 0;
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &capture_format_));
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(320, capture_format_.width);
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(240, capture_format_.height);
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(FileVideoCapturerTest, TestSupportedAsDesiredFormat) {
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(OpenFile("captured-320x240-2s-48.frames"));
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // desired format same as the capture format supported by the file
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  cricket::VideoFormat desired = capturer_->GetSupportedFormats()->at(0);
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &capture_format_));
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(desired == capture_format_);
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // desired format same as the supported capture format except the fourcc
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  desired.fourcc = cricket::FOURCC_ANY;
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &capture_format_));
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_NE(capture_format_.fourcc, desired.fourcc);
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // desired format with minimum interval
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  desired.interval = cricket::VideoFormat::kMinimumInterval;
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &capture_format_));
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(FileVideoCapturerTest, TestNoRepeat) {
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(OpenFile("captured-320x240-2s-48.frames"));
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  VideoCapturerListener listener;
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  capturer_->SignalFrameCaptured.connect(
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      &listener, &VideoCapturerListener::OnFrameCaptured);
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  capturer_->set_repeat(0);
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  capture_format_ = capturer_->GetSupportedFormats()->at(0);
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_->Start(capture_format_));
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE_WAIT(!capturer_->IsRunning(), 20000);
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(48, listener.frame_count());
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(FileVideoCapturerTest, TestRepeatForever) {
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Start the capturer_ with 50 fps and read no less than 150 frames.
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(OpenFile("captured-320x240-2s-48.frames"));
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  VideoCapturerListener listener;
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  capturer_->SignalFrameCaptured.connect(
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      &listener, &VideoCapturerListener::OnFrameCaptured);
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  capturer_->set_repeat(talk_base::kForever);
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  capture_format_ = capturer_->GetSupportedFormats()->at(0);
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  capture_format_.interval = cricket::VideoFormat::FpsToInterval(50);
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_->Start(capture_format_));
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(NULL != capturer_->GetCaptureFormat());
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(capture_format_ == *capturer_->GetCaptureFormat());
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE_WAIT(!capturer_->IsRunning() ||
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   listener.frame_count() >= 150, 20000);
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  capturer_->Stop();
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(capturer_->IsRunning());
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_GE(listener.frame_count(), 150);
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(listener.resolution_changed());
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(listener.frame_width(), capture_format_.width);
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(listener.frame_height(), capture_format_.height);
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1778502b95e019b7f9038cd7b2e260844c72e913522andrew@webrtc.org// See: https://code.google.com/p/webrtc/issues/detail?id=2409
1788502b95e019b7f9038cd7b2e260844c72e913522andrew@webrtc.orgTEST_F(FileVideoCapturerTest, DISABLED_TestPartialFrameHeader) {
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(OpenFile("1.frame_plus_1.byte"));
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  VideoCapturerListener listener;
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  capturer_->SignalFrameCaptured.connect(
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      &listener, &VideoCapturerListener::OnFrameCaptured);
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  capturer_->set_repeat(0);
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  capture_format_ = capturer_->GetSupportedFormats()->at(0);
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_->Start(capture_format_));
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE_WAIT(!capturer_->IsRunning(), 1000);
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(1, listener.frame_count());
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(FileVideoCapturerTest, TestFileDevices) {
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  cricket::Device not_a_file("I'm a camera", "with an id");
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      cricket::FileVideoCapturer::IsFileVideoCapturerDevice(not_a_file));
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  const std::string test_file =
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      cricket::GetTestFilePath("captured-320x240-2s-48.frames");
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  cricket::Device file_device =
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      cricket::FileVideoCapturer::CreateFileVideoCapturerDevice(test_file);
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      cricket::FileVideoCapturer::IsFileVideoCapturerDevice(file_device));
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(capturer_->Init(file_device));
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(file_device.id, capturer_->GetId());
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // unnamed namespace
205