diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-02-28 18:46:42 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-02-28 18:46:42 +0000 |
| commit | 8bb4ba8f424cac07f7730fca99d5333fcd76a84d (patch) | |
| tree | a5be1442aaff21809dd9928e4c45a3934540292b /src | |
| parent | 2e5b4effbc5e7f7ac74cae541a05d3401c9170b0 (diff) | |
| parent | 5b892b4b6792456070cb3face8b9efb48968658d (diff) | |
Merge branch 'master' into i18n
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/image.cc | 78 | ||||
| -rw-r--r-- | src/lib/image.h | 5 | ||||
| -rw-r--r-- | src/lib/job.cc | 7 | ||||
| -rw-r--r-- | src/wx/film_editor.cc | 2 |
4 files changed, 77 insertions, 15 deletions
diff --git a/src/lib/image.cc b/src/lib/image.cc index ae87304c2..b7ac13ab1 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -68,6 +68,11 @@ Image::lines (int n) const case PIX_FMT_RGBA: case PIX_FMT_YUV422P10LE: case PIX_FMT_YUV422P: + case PIX_FMT_YUV444P: + case PIX_FMT_YUV444P9BE: + case PIX_FMT_YUV444P9LE: + case PIX_FMT_YUV444P10BE: + case PIX_FMT_YUV444P10LE: return size().height; default: throw PixelFormatError ("lines()", _pixel_format); @@ -84,6 +89,11 @@ Image::components () const case PIX_FMT_YUV420P: case PIX_FMT_YUV422P10LE: case PIX_FMT_YUV422P: + case PIX_FMT_YUV444P: + case PIX_FMT_YUV444P9BE: + case PIX_FMT_YUV444P9LE: + case PIX_FMT_YUV444P10BE: + case PIX_FMT_YUV444P10LE: return 3; case PIX_FMT_RGB24: case PIX_FMT_RGBA: @@ -201,6 +211,12 @@ Image::post_process (string pp, bool aligned) const case PIX_FMT_YUV422P: pp_format = PP_FORMAT_422; break; + case PIX_FMT_YUV444P: + case PIX_FMT_YUV444P9BE: + case PIX_FMT_YUV444P9LE: + case PIX_FMT_YUV444P10BE: + case PIX_FMT_YUV444P10LE: + pp_format = PP_FORMAT_444; default: throw PixelFormatError ("post_process", pixel_format()); } @@ -248,30 +264,65 @@ Image::crop (Crop crop, bool aligned) const return out; } +/** Blacken a YUV image whose bits per pixel is rounded up to 16 */ +void +Image::yuv_16_black (uint16_t v) +{ + memset (data()[0], 0, lines(0) * stride()[0]); + for (int i = 1; i < 3; ++i) { + int16_t* p = reinterpret_cast<int16_t*> (data()[i]); + for (int y = 0; y < size().height; ++y) { + for (int x = 0; x < line_size()[i] / 2; ++x) { + p[x] = v; + } + p += stride()[i] / 2; + } + } +} + +uint16_t +Image::swap_16 (uint16_t v) +{ + return ((v >> 8) & 0xff) | ((v & 0xff) << 8); +} + void Image::make_black () { + /* U/V black value for 9-bit colour */ + static uint16_t const nine_bit_uv = (1 << 8) - 1; + + /* U/V black value for 10-bit colour */ + static uint16_t const ten_bit_uv = (1 << 9) - 1; + switch (_pixel_format) { case PIX_FMT_YUV420P: case PIX_FMT_YUV422P: + case PIX_FMT_YUV444P: memset (data()[0], 0, lines(0) * stride()[0]); memset (data()[1], 0x7f, lines(1) * stride()[1]); memset (data()[2], 0x7f, lines(2) * stride()[2]); break; + case PIX_FMT_YUV422P9LE: + case PIX_FMT_YUV444P9LE: + yuv_16_black (nine_bit_uv); + break; + + case PIX_FMT_YUV422P9BE: + case PIX_FMT_YUV444P9BE: + yuv_16_black (swap_16 (nine_bit_uv)); + break; + case PIX_FMT_YUV422P10LE: - memset (data()[0], 0, lines(0) * stride()[0]); - for (int i = 1; i < 3; ++i) { - int16_t* p = reinterpret_cast<int16_t*> (data()[i]); - for (int y = 0; y < size().height; ++y) { - for (int x = 0; x < line_size()[i] / 2; ++x) { - p[x] = (1 << 9) - 1; - } - p += stride()[i] / 2; - } - } + case PIX_FMT_YUV444P10LE: + yuv_16_black (ten_bit_uv); break; + case PIX_FMT_YUV444P10BE: + case PIX_FMT_YUV422P10BE: + yuv_16_black (swap_16 (ten_bit_uv)); + case PIX_FMT_RGB24: memset (data()[0], 0, lines(0) * stride()[0]); break; @@ -375,6 +426,13 @@ Image::bytes_per_pixel (int c) const } else { return 1; } + case PIX_FMT_YUV444P: + return 3; + case PIX_FMT_YUV444P9BE: + case PIX_FMT_YUV444P9LE: + case PIX_FMT_YUV444P10LE: + case PIX_FMT_YUV444P10BE: + return 6; default: assert (false); } diff --git a/src/lib/image.h b/src/lib/image.h index f40ea9280..6b9ade99e 100644 --- a/src/lib/image.h +++ b/src/lib/image.h @@ -92,7 +92,10 @@ protected: virtual void swap (Image &); float bytes_per_pixel (int) const; -private: +private: + void yuv_16_black (uint16_t); + static uint16_t swap_16 (uint16_t); + AVPixelFormat _pixel_format; ///< FFmpeg's way of describing the pixel format of this Image }; diff --git a/src/lib/job.cc b/src/lib/job.cc index bde2c8cfd..bfad65a0a 100644 --- a/src/lib/job.cc +++ b/src/lib/job.cc @@ -272,10 +272,11 @@ Job::status () const } stringstream s; - if (!finished () && p >= 0 && t > 10 && r > 0) { - s << pc << "%; " << seconds_to_approximate_hms (r) << " remaining"; - } else if (!finished () && (t <= 10 || r == 0)) { + if (!finished ()) { s << pc << "%"; + if (p >= 0 && t > 10 && r > 0) { + s << "; " << seconds_to_approximate_hms (r) << " remaining"; + } } else if (finished_ok ()) { s << "OK (ran for " << seconds_to_hms (_ran_for) << ")"; } else if (finished_in_error ()) { diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc index 54eccb4f1..68291a812 100644 --- a/src/wx/film_editor.cc +++ b/src/wx/film_editor.cc @@ -124,7 +124,7 @@ FilmEditor::make_film_panel () _dcp_content_type = new wxChoice (_film_panel, wxID_ANY); grid->Add (_dcp_content_type); - video_control (add_label_to_sizer (grid, _film_panel, _("Frames Per Second"))); + video_control (add_label_to_sizer (grid, _film_panel, _("Original Frame Rate"))); _frames_per_second = new wxStaticText (_film_panel, wxID_ANY, wxT ("")); grid->Add (video_control (_frames_per_second), 1, wxALIGN_CENTER_VERTICAL); |
