void ScaleDisplayByAspectRatio(gfx::IntSize& aDisplay, float aAspectRatio) { if (aAspectRatio > 1.0) { // Increase the intrinsic width aDisplay.width = ConditionDimension(aAspectRatio * aDisplay.width); } else { // Increase the intrinsic height aDisplay.height = ConditionDimension(aDisplay.height / aAspectRatio); } }
void nsMediaDecoder::Invalidate() { if (!mElement) return; nsIFrame* frame = mElement->GetPrimaryFrame(); PRBool invalidateFrame = PR_FALSE; { nsAutoLock lock(mVideoUpdateLock); // Get mImageContainerSizeChanged while holding the lock. invalidateFrame = mImageContainerSizeChanged; mImageContainerSizeChanged = PR_FALSE; if (mSizeChanged) { nsIntSize scaledSize(mRGBWidth, mRGBHeight); // Apply the aspect ratio to produce the intrinsic size we report // to the element. if (mPixelAspectRatio > 1.0) { // Increase the intrinsic width scaledSize.width = ConditionDimension(mPixelAspectRatio*scaledSize.width, scaledSize.width); } else { // Increase the intrinsic height scaledSize.height = ConditionDimension(scaledSize.height/mPixelAspectRatio, scaledSize.height); } mElement->UpdateMediaSize(scaledSize); mSizeChanged = PR_FALSE; if (frame) { nsPresContext* presContext = frame->PresContext(); nsIPresShell *presShell = presContext->PresShell(); presShell->FrameNeedsReflow(frame, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY); } } } if (frame) { nsRect contentRect = frame->GetContentRect() - frame->GetPosition(); if (invalidateFrame) { frame->Invalidate(contentRect); } else { frame->InvalidateLayer(contentRect, nsDisplayItem::TYPE_VIDEO); } } #ifdef MOZ_SVG nsSVGEffects::InvalidateDirectRenderingObservers(mElement); #endif }
/* static */ bool H264::DecodeSPS(const mozilla::MediaByteBuffer* aSPS, SPSData& aDest) { MOZ_ASSERT(aSPS); BitReader br(aSPS); int32_t lastScale; int32_t nextScale; int32_t deltaScale; aDest.profile_idc = br.ReadBits(8); aDest.constraint_set0_flag = br.ReadBit(); aDest.constraint_set1_flag = br.ReadBit(); aDest.constraint_set2_flag = br.ReadBit(); aDest.constraint_set3_flag = br.ReadBit(); aDest.constraint_set4_flag = br.ReadBit(); aDest.constraint_set5_flag = br.ReadBit(); br.ReadBits(2); // reserved_zero_2bits aDest.level_idc = br.ReadBits(8); aDest.seq_parameter_set_id = br.ReadUE(); if (aDest.profile_idc == 100 || aDest.profile_idc == 110 || aDest.profile_idc == 122 || aDest.profile_idc == 244 || aDest.profile_idc == 44 || aDest.profile_idc == 83 || aDest.profile_idc == 86 || aDest.profile_idc == 118 || aDest.profile_idc == 128 || aDest.profile_idc == 138 || aDest.profile_idc == 139 || aDest.profile_idc == 134) { if ((aDest.chroma_format_idc = br.ReadUE()) == 3) { aDest.separate_colour_plane_flag = br.ReadBit(); } br.ReadUE(); // bit_depth_luma_minus8 br.ReadUE(); // bit_depth_chroma_minus8 br.ReadBit(); // qpprime_y_zero_transform_bypass_flag if (br.ReadBit()) { // seq_scaling_matrix_present_flag for (int idx = 0; idx < ((aDest.chroma_format_idc != 3) ? 8 : 12); ++idx) { if (br.ReadBit()) { // Scaling list present lastScale = nextScale = 8; int sl_n = (idx < 6) ? 16 : 64; for (int sl_i = 0; sl_i < sl_n; sl_i++) { if (nextScale) { deltaScale = br.ReadSE(); nextScale = (lastScale + deltaScale + 256) % 256; } lastScale = (nextScale == 0) ? lastScale : nextScale; } } } } } else if (aDest.profile_idc == 183) { aDest.chroma_format_idc = 0; } else { // default value if chroma_format_idc isn't set. aDest.chroma_format_idc = 1; } aDest.log2_max_frame_num = br.ReadUE() + 4; aDest.pic_order_cnt_type = br.ReadUE(); if (aDest.pic_order_cnt_type == 0) { aDest.log2_max_pic_order_cnt_lsb = br.ReadUE() + 4; } else if (aDest.pic_order_cnt_type == 1) { aDest.delta_pic_order_always_zero_flag = br.ReadBit(); aDest.offset_for_non_ref_pic = br.ReadSE(); aDest.offset_for_top_to_bottom_field = br.ReadSE(); uint32_t num_ref_frames_in_pic_order_cnt_cycle = br.ReadUE(); for (uint32_t i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) { br.ReadSE(); // offset_for_ref_frame[i] } } aDest.max_num_ref_frames = br.ReadUE(); aDest.gaps_in_frame_num_allowed_flag = br.ReadBit(); aDest.pic_width_in_mbs = br.ReadUE() + 1; aDest.pic_height_in_map_units = br.ReadUE() + 1; aDest.frame_mbs_only_flag = br.ReadBit(); if (!aDest.frame_mbs_only_flag) { aDest.pic_height_in_map_units *= 2; aDest.mb_adaptive_frame_field_flag = br.ReadBit(); } br.ReadBit(); // direct_8x8_inference_flag aDest.frame_cropping_flag = br.ReadBit(); if (aDest.frame_cropping_flag) { aDest.frame_crop_left_offset = br.ReadUE(); aDest.frame_crop_right_offset = br.ReadUE(); aDest.frame_crop_top_offset = br.ReadUE(); aDest.frame_crop_bottom_offset = br.ReadUE(); } aDest.sample_ratio = 1.0f; aDest.vui_parameters_present_flag = br.ReadBit(); if (aDest.vui_parameters_present_flag) { vui_parameters(br, aDest); } // Calculate common values. uint8_t ChromaArrayType = aDest.separate_colour_plane_flag ? 0 : aDest.chroma_format_idc; // Calculate width. uint32_t CropUnitX = 1; uint32_t SubWidthC = aDest.chroma_format_idc == 3 ? 1 : 2; if (ChromaArrayType != 0) { CropUnitX = SubWidthC; } // Calculate Height uint32_t CropUnitY = 2 - aDest.frame_mbs_only_flag; uint32_t SubHeightC = aDest.chroma_format_idc <= 1 ? 2 : 1; if (ChromaArrayType != 0) { CropUnitY *= SubHeightC; } uint32_t width = aDest.pic_width_in_mbs * 16; uint32_t height = aDest.pic_height_in_map_units * 16; if (aDest.frame_crop_left_offset <= std::numeric_limits<int32_t>::max() / 4 / CropUnitX && aDest.frame_crop_right_offset <= std::numeric_limits<int32_t>::max() / 4 / CropUnitX && aDest.frame_crop_top_offset <= std::numeric_limits<int32_t>::max() / 4 / CropUnitY && aDest.frame_crop_bottom_offset <= std::numeric_limits<int32_t>::max() / 4 / CropUnitY && (aDest.frame_crop_left_offset + aDest.frame_crop_right_offset) * CropUnitX < width && (aDest.frame_crop_top_offset + aDest.frame_crop_bottom_offset) * CropUnitY < height) { aDest.crop_left = aDest.frame_crop_left_offset * CropUnitX; aDest.crop_right = aDest.frame_crop_right_offset * CropUnitX; aDest.crop_top = aDest.frame_crop_top_offset * CropUnitY; aDest.crop_bottom = aDest.frame_crop_bottom_offset * CropUnitY; } else { // Nonsensical value, ignore them. aDest.crop_left = aDest.crop_right = aDest.crop_top = aDest.crop_bottom = 0; } aDest.pic_width = width - aDest.crop_left - aDest.crop_right; aDest.pic_height = height - aDest.crop_top - aDest.crop_bottom; aDest.interlaced = !aDest.frame_mbs_only_flag; // Determine display size. if (aDest.sample_ratio > 1.0) { // Increase the intrinsic width aDest.display_width = ConditionDimension(aDest.pic_width * aDest.sample_ratio); aDest.display_height = aDest.pic_height; } else { // Increase the intrinsic height aDest.display_width = aDest.pic_width; aDest.display_height = ConditionDimension(aDest.pic_height / aDest.sample_ratio); } return true; }