| OLD | NEW | 
|---|
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.  Use of this | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.  Use of this | 
| 2 // source code is governed by a BSD-style license that can be found in the | 2 // source code is governed by a BSD-style license that can be found in the | 
| 3 // LICENSE file. | 3 // LICENSE file. | 
| 4 | 4 | 
| 5 #ifndef MEDIA_TOOLS_PLAYER_WTL_VIEW_H_ | 5 #ifndef MEDIA_TOOLS_PLAYER_WTL_VIEW_H_ | 
| 6 #define MEDIA_TOOLS_PLAYER_WTL_VIEW_H_ | 6 #define MEDIA_TOOLS_PLAYER_WTL_VIEW_H_ | 
| 7 | 7 | 
| 8 #include <stdio.h> | 8 #include <stdio.h> | 
| 9 #include <process.h> | 9 #include <process.h> | 
| 10 #include <string.h> | 10 #include <string.h> | 
| 11 | 11 | 
| 12 #include "media/base/buffers.h" | 12 #include "media/base/video_frame.h" | 
| 13 #include "media/base/yuv_convert.h" | 13 #include "media/base/yuv_convert.h" | 
| 14 #include "media/tools/player_wtl/movie.h" | 14 #include "media/tools/player_wtl/movie.h" | 
| 15 #include "media/tools/player_wtl/player_wtl.h" | 15 #include "media/tools/player_wtl/player_wtl.h" | 
| 16 #include "media/tools/player_wtl/wtl_renderer.h" | 16 #include "media/tools/player_wtl/wtl_renderer.h" | 
| 17 | 17 | 
| 18 // Fetchs current time as milliseconds. | 18 // Fetchs current time as milliseconds. | 
| 19 // Returns as double for high duration and precision. | 19 // Returns as double for high duration and precision. | 
| 20 inline double GetTime() { | 20 inline double GetTime() { | 
| 21   LARGE_INTEGER perf_time, perf_hz; | 21   LARGE_INTEGER perf_time, perf_hz; | 
| 22   QueryPerformanceFrequency(&perf_hz);  // May change with speed step. | 22   QueryPerformanceFrequency(&perf_hz);  // May change with speed step. | 
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 114     } | 114     } | 
| 115     if (!bmp_.IsNull()) { | 115     if (!bmp_.IsNull()) { | 
| 116       dc.MoveTo(size_.cx, 0); | 116       dc.MoveTo(size_.cx, 0); | 
| 117       dc.LineTo(size_.cx, size_.cy); | 117       dc.LineTo(size_.cx, size_.cy); | 
| 118       dc.LineTo(0, size_.cy); | 118       dc.LineTo(0, size_.cy); | 
| 119     } | 119     } | 
| 120     return 0; | 120     return 0; | 
| 121   } | 121   } | 
| 122 | 122 | 
| 123   // Convert the video frame to RGB and Blit. | 123   // Convert the video frame to RGB and Blit. | 
| 124   void ConvertFrame(media::VideoFrame * video_frame) { | 124   void ConvertFrame(media::VideoFrame* video_frame) { | 
| 125     media::VideoSurface frame_in; |  | 
| 126     bool lock_result = video_frame->Lock(&frame_in); |  | 
| 127     DCHECK(lock_result); |  | 
| 128     BITMAP bm; | 125     BITMAP bm; | 
| 129     bmp_.GetBitmap(&bm); | 126     bmp_.GetBitmap(&bm); | 
| 130     int dibwidth = bm.bmWidth; | 127     int dibwidth = bm.bmWidth; | 
| 131     int dibheight = bm.bmHeight; | 128     int dibheight = bm.bmHeight; | 
| 132 | 129 | 
| 133     uint8 *movie_dib_bits = reinterpret_cast<uint8 *>(bm.bmBits) + | 130     uint8 *movie_dib_bits = reinterpret_cast<uint8 *>(bm.bmBits) + | 
| 134         bm.bmWidthBytes * (bm.bmHeight - 1); | 131         bm.bmWidthBytes * (bm.bmHeight - 1); | 
| 135     int dibrowbytes = -bm.bmWidthBytes; | 132     int dibrowbytes = -bm.bmWidthBytes; | 
| 136     int clipped_width = frame_in.width; | 133     int clipped_width = video_frame->width(); | 
| 137     if (dibwidth < clipped_width) { | 134     if (dibwidth < clipped_width) { | 
| 138       clipped_width = dibwidth; | 135       clipped_width = dibwidth; | 
| 139     } | 136     } | 
| 140     int clipped_height = frame_in.height; | 137     int clipped_height = video_frame->height(); | 
| 141     if (dibheight < clipped_height) { | 138     if (dibheight < clipped_height) { | 
| 142       clipped_height = dibheight; | 139       clipped_height = dibheight; | 
| 143     } | 140     } | 
| 144 | 141 | 
| 145     int scaled_width = clipped_width; | 142     int scaled_width = clipped_width; | 
| 146     int scaled_height = clipped_height; | 143     int scaled_height = clipped_height; | 
| 147     switch (view_size_) { | 144     switch (view_size_) { | 
| 148       case 0: | 145       case 0: | 
| 149         scaled_width = clipped_width / 4; | 146         scaled_width = clipped_width / 4; | 
| 150         scaled_height = clipped_height / 4; | 147         scaled_height = clipped_height / 4; | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 179         scaled_width = clipped_width; | 176         scaled_width = clipped_width; | 
| 180         scaled_height = clipped_height; | 177         scaled_height = clipped_height; | 
| 181         clipped_width = scaled_width / 4; | 178         clipped_width = scaled_width / 4; | 
| 182         clipped_height = scaled_height / 4; | 179         clipped_height = scaled_height / 4; | 
| 183         break; | 180         break; | 
| 184     } | 181     } | 
| 185 | 182 | 
| 186     // Append each frame to end of file. | 183     // Append each frame to end of file. | 
| 187     bool enable_dump_yuv_file = media::Movie::get()->GetDumpYuvFileEnable(); | 184     bool enable_dump_yuv_file = media::Movie::get()->GetDumpYuvFileEnable(); | 
| 188     if (enable_dump_yuv_file) { | 185     if (enable_dump_yuv_file) { | 
| 189       DumpYUV(frame_in); | 186       DumpYUV(video_frame); | 
| 190     } | 187     } | 
| 191 | 188 | 
| 192 #ifdef TESTING | 189 #ifdef TESTING | 
| 193     double yuv_time_start = GetTime();  // Start timer. | 190     double yuv_time_start = GetTime();  // Start timer. | 
| 194 #endif | 191 #endif | 
| 195 | 192 | 
| 196     bool enable_draw = media::Movie::get()->GetDrawEnable(); | 193     bool enable_draw = media::Movie::get()->GetDrawEnable(); | 
| 197     if (enable_draw) { | 194     if (enable_draw) { | 
| 198       DCHECK(bm.bmBitsPixel == 32); | 195       DCHECK(bm.bmBitsPixel == 32); | 
| 199       DrawYUV(frame_in, | 196       DrawYUV(video_frame, | 
| 200               movie_dib_bits, | 197               movie_dib_bits, | 
| 201               dibrowbytes, | 198               dibrowbytes, | 
| 202               clipped_width, | 199               clipped_width, | 
| 203               clipped_height, | 200               clipped_height, | 
| 204               scaled_width, | 201               scaled_width, | 
| 205               scaled_height); | 202               scaled_height); | 
| 206     } | 203     } | 
| 207 #ifdef TESTING | 204 #ifdef TESTING | 
| 208     double yuv_time_end = GetTime(); | 205     double yuv_time_end = GetTime(); | 
| 209     static int yuv_time_count = 0; | 206     static int yuv_time_count = 0; | 
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 337  private: | 334  private: | 
| 338   HBITMAP hbmp_;  // For Images | 335   HBITMAP hbmp_;  // For Images | 
| 339   // View Size: 0=1/4, 1=0.5, 2=normal, 3=2x, 4=3x, 5=4x, 3=fit, 4=full. | 336   // View Size: 0=1/4, 1=0.5, 2=normal, 3=2x, 4=3x, 5=4x, 3=fit, 4=full. | 
| 340   int view_size_; | 337   int view_size_; | 
| 341 | 338 | 
| 342   // View Rotate 0-5 for ID_VIEW_ROTATE0 to ID_VIEW_MIRROR_VERTICAL | 339   // View Rotate 0-5 for ID_VIEW_ROTATE0 to ID_VIEW_MIRROR_VERTICAL | 
| 343   media::Rotate view_rotate_; | 340   media::Rotate view_rotate_; | 
| 344 | 341 | 
| 345   // Draw a frame of YUV to an RGB buffer with scaling. | 342   // Draw a frame of YUV to an RGB buffer with scaling. | 
| 346   // Handles different YUV formats. | 343   // Handles different YUV formats. | 
| 347   void DrawYUV(const media::VideoSurface &frame_in, | 344   void DrawYUV(const media::VideoFrame* video_frame, | 
| 348                uint8 *movie_dib_bits, | 345                uint8 *movie_dib_bits, | 
| 349                int dibrowbytes, | 346                int dibrowbytes, | 
| 350                int clipped_width, | 347                int clipped_width, | 
| 351                int clipped_height, | 348                int clipped_height, | 
| 352                int scaled_width, | 349                int scaled_width, | 
| 353                int scaled_height) { | 350                int scaled_height) { | 
| 354     media::YUVType yuv_type = (frame_in.format == media::VideoSurface::YV12) ? | 351     media::YUVType yuv_type = | 
| 355         media::YV12 : media::YV16; | 352       (video_frame->format() == media::VideoFrame::YV12) ? | 
|  | 353       media::YV12 : media::YV16; | 
| 356 | 354 | 
| 357     // Simple convert is not necessary for performance, but allows | 355     // Simple convert is not necessary for performance, but allows | 
| 358     // easier alternative implementations. | 356     // easier alternative implementations. | 
| 359     if ((view_rotate_ == media::ROTATE_0) &&   // Not scaled or rotated | 357     if ((view_rotate_ == media::ROTATE_0) &&   // Not scaled or rotated | 
| 360         (view_size_ == 2)) { | 358         (view_size_ == 2)) { | 
| 361       media::ConvertYUVToRGB32(frame_in.data[0], | 359       media::ConvertYUVToRGB32(video_frame->data(0), | 
| 362                                frame_in.data[1], | 360                                video_frame->data(1), | 
| 363                                frame_in.data[2], | 361                                video_frame->data(2), | 
| 364                                movie_dib_bits, | 362                                movie_dib_bits, | 
| 365                                scaled_width, scaled_height, | 363                                scaled_width, scaled_height, | 
| 366                                frame_in.strides[0], | 364                                video_frame->stride(0), | 
| 367                                frame_in.strides[1], | 365                                video_frame->stride(1), | 
| 368                                dibrowbytes, | 366                                dibrowbytes, | 
| 369                                yuv_type); | 367                                yuv_type); | 
| 370     } else { | 368     } else { | 
| 371       media::ScaleYUVToRGB32(frame_in.data[0], | 369       media::ScaleYUVToRGB32(video_frame->data(0), | 
| 372                              frame_in.data[1], | 370                              video_frame->data(1), | 
| 373                              frame_in.data[2], | 371                              video_frame->data(2), | 
| 374                              movie_dib_bits, | 372                              movie_dib_bits, | 
| 375                              clipped_width, clipped_height, | 373                              clipped_width, clipped_height, | 
| 376                              scaled_width, scaled_height, | 374                              scaled_width, scaled_height, | 
| 377                              frame_in.strides[0], | 375                              video_frame->stride(0), | 
| 378                              frame_in.strides[1], | 376                              video_frame->stride(1), | 
| 379                              dibrowbytes, | 377                              dibrowbytes, | 
| 380                              yuv_type, | 378                              yuv_type, | 
| 381                              view_rotate_); | 379                              view_rotate_); | 
| 382     } | 380     } | 
| 383   } | 381   } | 
| 384 | 382 | 
| 385   // Diagnostic function to write out YUV in format compatible with PYUV tool. | 383   // Diagnostic function to write out YUV in format compatible with PYUV tool. | 
| 386   void DumpYUV(const media::VideoSurface &frame_in) { | 384   void DumpYUV(const media::VideoFrame* video_frame) { | 
| 387     FILE * file_yuv = fopen("raw.yuv", "ab+");  // Open for append binary. | 385     FILE * file_yuv = fopen("raw.yuv", "ab+");  // Open for append binary. | 
| 388     if (file_yuv != NULL) { | 386     if (file_yuv != NULL) { | 
| 389       fseek(file_yuv, 0, SEEK_END); | 387       fseek(file_yuv, 0, SEEK_END); | 
| 390       const size_t frame_size = frame_in.width * frame_in.height; | 388       const size_t frame_size = | 
| 391       for (size_t y = 0; y < frame_in.height; ++y) | 389         video_frame->width() * video_frame->height(); | 
| 392         fwrite(frame_in.data[0]+frame_in.strides[0]*y, | 390       for (size_t y = 0; y < video_frame->height(); ++y) | 
| 393           frame_in.width,   sizeof(uint8), file_yuv); | 391         fwrite(video_frame->data(0) + video_frame->stride(0)*y, | 
| 394       for (size_t y = 0; y < frame_in.height/2; ++y) | 392           video_frame->width(), sizeof(uint8), file_yuv); | 
| 395         fwrite(frame_in.data[1]+frame_in.strides[1]*y, | 393       for (size_t y = 0; y < video_frame->height()/2; ++y) | 
| 396           frame_in.width/2, sizeof(uint8), file_yuv); | 394         fwrite(video_frame->data(1) + video_frame->stride(1)*y, | 
| 397       for (size_t y = 0; y < frame_in.height/2; ++y) | 395           video_frame->width() / 2, sizeof(uint8), file_yuv); | 
| 398         fwrite(frame_in.data[2]+frame_in.strides[2]*y, | 396       for (size_t y = 0; y < video_frame->height()/2; ++y) | 
| 399           frame_in.width/2, sizeof(uint8), file_yuv); | 397         fwrite(video_frame->data(2) + video_frame->stride(2)*y, | 
|  | 398           video_frame->width() / 2, sizeof(uint8), file_yuv); | 
| 400       fclose(file_yuv); | 399       fclose(file_yuv); | 
| 401 | 400 | 
| 402 #if TESTING | 401 #if TESTING | 
| 403       static int frame_dump_count = 0; | 402       static int frame_dump_count = 0; | 
| 404       char outputbuf[512]; | 403       char outputbuf[512]; | 
| 405       _snprintf_s(outputbuf, sizeof(outputbuf), "yuvdump %4d %dx%d stride %d\n", | 404       _snprintf_s(outputbuf, sizeof(outputbuf), "yuvdump %4d %dx%d stride %d\n", | 
| 406                   frame_dump_count, frame_in.width, frame_in.height, | 405                   frame_dump_count, video_frame->width(), | 
| 407                   frame_in.strides[0]); | 406                   video_frame->height(), | 
|  | 407                   video_frame->stride(0)); | 
| 408       OutputDebugStringA(outputbuf); | 408       OutputDebugStringA(outputbuf); | 
| 409       ++frame_dump_count; | 409       ++frame_dump_count; | 
| 410 #endif | 410 #endif | 
| 411     } | 411     } | 
| 412   } | 412   } | 
| 413 | 413 | 
| 414   media::VideoFrame* last_frame_; | 414   media::VideoFrame* last_frame_; | 
| 415   base::TimeDelta last_timestamp_; | 415   base::TimeDelta last_timestamp_; | 
| 416 | 416 | 
| 417   DISALLOW_COPY_AND_ASSIGN(WtlVideoWindow); | 417   DISALLOW_COPY_AND_ASSIGN(WtlVideoWindow); | 
| 418 }; | 418 }; | 
| 419 | 419 | 
| 420 #endif  // MEDIA_TOOLS_PLAYER_WTL_VIEW_H_ | 420 #endif  // MEDIA_TOOLS_PLAYER_WTL_VIEW_H_ | 
| OLD | NEW | 
|---|