Index: media/filters/jpeg_parser.cc |
diff --git a/media/filters/jpeg_parser.cc b/media/filters/jpeg_parser.cc |
index 66a3651210dc1add056c0b11dd71aea572b0f3ea..153ab48c8b3b79d84d349ed89025417599225780 100644 |
--- a/media/filters/jpeg_parser.cc |
+++ b/media/filters/jpeg_parser.cc |
@@ -49,6 +49,10 @@ static bool InRange(int value, int a, int b) { |
return a <= value && value <= b; |
} |
+static int RoundUp(int value, int mul) { |
+ return (value + mul - 1) / mul * mul; |
+} |
+ |
// |frame_header| is already initialized to 0 in ParseJpegPicture. |
static bool ParseSOF(const char* buffer, |
size_t length, |
@@ -76,6 +80,8 @@ static bool ParseSOF(const char* buffer, |
return false; |
} |
+ int max_h_factor = 0; |
+ int max_v_factor = 0; |
for (size_t i = 0; i < frame_header->num_components; i++) { |
JpegComponent& component = frame_header->components[i]; |
READ_U8_OR_RETURN_FALSE(&component.id); |
@@ -89,6 +95,10 @@ static bool ParseSOF(const char* buffer, |
READ_U8_OR_RETURN_FALSE(&hv); |
component.horizontal_sampling_factor = hv / 16; |
component.vertical_sampling_factor = hv % 16; |
+ if (component.horizontal_sampling_factor > max_h_factor) |
+ max_h_factor = component.horizontal_sampling_factor; |
+ if (component.vertical_sampling_factor > max_v_factor) |
+ max_v_factor = component.vertical_sampling_factor; |
if (!InRange(component.horizontal_sampling_factor, 1, 4)) { |
DVLOG(1) << "Invalid horizontal sampling factor " |
<< static_cast<int>(component.horizontal_sampling_factor); |
@@ -102,6 +112,13 @@ static bool ParseSOF(const char* buffer, |
READ_U8_OR_RETURN_FALSE(&component.quantization_table_selector); |
} |
+ // The size of data unit is 8*8 and the coded size should be extended |
+ // to complete minimum coded unit, MCU. See Spec A.2. |
+ frame_header->coded_width = RoundUp(frame_header->visible_width, |
+ max_h_factor * 8); |
+ frame_header->coded_height = RoundUp(frame_header->visible_height, |
+ max_v_factor * 8); |
+ |
return true; |
} |