56 {
57 std::size_t imgSize = imgData->width() * imgData->height() * 3;
58
59 if (static_cast<std::size_t>(data_size_) < imgSize) {
60 if (!data_) {
61 delete[] data_;
62 }
63
64 data_ = new GLubyte[imgSize];
65 if (data_ == nullptr) {
66 data_size_ = 0;
67 return false;
68 }
69 data_size_ = static_cast<GLsizei>(imgSize);
71 }
72
73 texture_format_ = GL_RGB;
74 if (imgData->encoding() == std::string("yuyv")) {
75 const GLubyte* src =
76 reinterpret_cast<const GLubyte*>(imgData->data().c_str());
77
78 GLubyte* dst = data_;
79 for (std::size_t i = 0; i < imgData->data().size(); i += 4) {
80 int y = 298 * (src[i] - 16);
81 int u = src[i + 1] - 128;
82 int u1 = 516 * u;
83 int v = src[i + 3] - 128;
84 int v1 = 208 * v;
85
86 u *= 100;
87 v *= 409;
88
89#define CLAMP(v) static_cast<GLubyte>((v) > 255 ? 255 : ((v) < 0 ? 0 : v))
90 *dst++ =
CLAMP((y + v + 128) >> 8);
91 *dst++ =
CLAMP((y - u - v1 + 128) >> 8);
92 *dst++ =
CLAMP((y + u1 + 128) >> 8);
93
94 y = 298 * (src[i + 2] - 16);
95
96 *dst++ =
CLAMP((y + v + 128) >> 8);
97 *dst++ =
CLAMP((y - u - v1 + 128) >> 8);
98 *dst++ =
CLAMP((y + u1 + 128) >> 8);
99#undef CLAMP
100 }
101 } else if (imgData->encoding() == std::string("rgb8")) {
102 memcpy(data_, imgData->data().c_str(), imgSize);
103 } else if (imgData->encoding() == std::string("bgr8")) {
104 memcpy(data_, imgData->data().c_str(), imgSize);
105 texture_format_ = GL_BGR;
106 } else {
107 memset(data_, 0, imgSize);
108 std::cerr << "Cannot support this format (" << imgData->encoding()
109 << ") image" << std::endl;
110 }
112
113 image_height_ = imgData->height();
114 image_width_ = imgData->width();
115
116 return true;
117}