1/*M///////////////////////////////////////////////////////////////////////////////////////
2//
3//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4//
5//  By downloading, copying, installing or using the software you agree to this license.
6//  If you do not agree to this license, do not download, install,
7//  copy or use the software.
8//
9//
10//                          License Agreement
11//                For Open Source Computer Vision Library
12//
13// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
15// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
16// Third party copyrights are property of their respective owners.
17//
18// Redistribution and use in source and binary forms, with or without modification,
19// are permitted provided that the following conditions are met:
20//
21//   * Redistribution's of source code must retain the above copyright notice,
22//     this list of conditions and the following disclaimer.
23//
24//   * Redistribution's in binary form must reproduce the above copyright notice,
25//     this list of conditions and the following disclaimer in the documentation
26//     and/or other materials provided with the distribution.
27//
28//   * The name of the copyright holders may not be used to endorse or promote products
29//     derived from this software without specific prior written permission.
30//
31// This software is provided by the copyright holders and contributors "as is" and
32// any express or implied warranties, including, but not limited to, the implied
33// warranties of merchantability and fitness for a particular purpose are disclaimed.
34// In no event shall the Intel Corporation or contributors be liable for any direct,
35// indirect, incidental, special, exemplary, or consequential damages
36// (including, but not limited to, procurement of substitute goods or services;
37// loss of use, data, or profits; or business interruption) however caused
38// and on any theory of liability, whether in contract, strict liability,
39// or tort (including negligence or otherwise) arising in any way out of
40// the use of this software, even if advised of the possibility of such damage.
41//
42//M*/
43
44#include "precomp.hpp"
45
46#ifdef HAVE_NVCUVID
47
48using namespace cv;
49using namespace cv::cudacodec;
50using namespace cv::cudacodec::detail;
51
52bool cv::cudacodec::detail::VideoSource::parseVideoData(const unsigned char* data, size_t size, bool endOfStream)
53{
54    return videoParser_->parseVideoData(data, size, endOfStream);
55}
56
57cv::cudacodec::detail::RawVideoSourceWrapper::RawVideoSourceWrapper(const Ptr<RawVideoSource>& source) :
58    source_(source)
59{
60    CV_Assert( !source_.empty() );
61}
62
63cv::cudacodec::FormatInfo cv::cudacodec::detail::RawVideoSourceWrapper::format() const
64{
65    return source_->format();
66}
67
68void cv::cudacodec::detail::RawVideoSourceWrapper::start()
69{
70    stop_ = false;
71    hasError_ = false;
72    thread_.reset(new Thread(readLoop, this));
73}
74
75void cv::cudacodec::detail::RawVideoSourceWrapper::stop()
76{
77    stop_ = true;
78    thread_->wait();
79    thread_.release();
80}
81
82bool cv::cudacodec::detail::RawVideoSourceWrapper::isStarted() const
83{
84    return !stop_;
85}
86
87bool cv::cudacodec::detail::RawVideoSourceWrapper::hasError() const
88{
89    return hasError_;
90}
91
92void cv::cudacodec::detail::RawVideoSourceWrapper::readLoop(void* userData)
93{
94    RawVideoSourceWrapper* thiz = static_cast<RawVideoSourceWrapper*>(userData);
95
96    for (;;)
97    {
98        unsigned char* data;
99        int size;
100        bool endOfFile;
101
102        if (!thiz->source_->getNextPacket(&data, &size, &endOfFile))
103        {
104            thiz->hasError_ = !endOfFile;
105            break;
106        }
107
108        if (!thiz->parseVideoData(data, size))
109        {
110            thiz->hasError_ = true;
111            break;
112        }
113
114        if (thiz->stop_)
115            break;
116    }
117
118    thiz->parseVideoData(0, 0, true);
119}
120
121#endif // HAVE_NVCUVID
122