virtual ~OutputSurface() = default;
- virtual void Render(const gfx::OverlayPlaneData&, gfx::OverlayRenderData) = 0;
+ virtual void Render(const gfx::OverlayPlaneData&,
+ gfx::Size,
+ gfx::OverlayRenderData) = 0;
};
std::ostream& operator<<(std::ostream& stream, OutputSurface::Plane plane);
}
void OutputSurfaceImpl::Render(const gfx::OverlayPlaneData& overlay_plane_data,
+ gfx::Size original_size,
gfx::OverlayRenderData render_data) {
if (last_picture_plane_ && render_data.picture_size.IsZero()) {
if (last_picture_plane_ != render_data.plane_id) {
return;
}
+ if (original_size != render_data.picture_size) {
+ TIZEN_MEDIA_LOG(INFO)
+ << "Pixmap size is different than decoded one, ignore it";
+ return;
+ }
+
// At first apply color changes as setting resolution depends on
// the value from |color_space_|.
if (overlay_plane_data.color_space != color_space_) {
// Might be called on different thread than creation and initialization
// was done. It's also common scenario that each decoder has it's own
// thread, so it should be also safe in such case.
- void Render(const gfx::OverlayPlaneData&, gfx::OverlayRenderData) override;
+ void Render(const gfx::OverlayPlaneData&,
+ gfx::Size,
+ gfx::OverlayRenderData) override;
void SetBelow(OutputSurfaceImpl& above);
surface = &scaler_it->surface();
}
- surface->Render(overlay_plane_data, render_data);
+ surface->Render(overlay_plane_data, render_data.picture_size, render_data);
}
} // namespace ui
}
void OutputSurfaceProxy::Render(const gfx::OverlayPlaneData& overlay_plane_data,
+ gfx::Size original_size,
gfx::OverlayRenderData render_data) {
base::AutoLock auto_lock(lock_);
while (!initialized_) {
event.Wait();
}
- impl_->Render(overlay_plane_data, render_data);
+ impl_->Render(overlay_plane_data, original_size, render_data);
}
base::TokenCB OutputSurfaceProxy::ResourceConflict() {
// OutputSurface implementation.
// Called on decoder thread only.
- void Render(const gfx::OverlayPlaneData&, gfx::OverlayRenderData) override;
+ void Render(const gfx::OverlayPlaneData&,
+ gfx::Size,
+ gfx::OverlayRenderData) override;
Plane plane() const { return plane_; }
nv12_data.uv_stride = handle_.planes[1].stride;
nv12_data.uv_phys_offset = handle_.planes[1].offset;
render_data.nv12_data = &nv12_data;
- surface->Render(overlay_plane_data, render_data);
+ surface->Render(overlay_plane_data, size_, render_data);
return true;
}
auto surface = surface_factory_->GetSurface(widget);
if (surface) {
overlay_plane->Render(base::BindRepeating(
- &OutputSurface::Render, std::move(surface), overlay_plane_data));
+ &OutputSurface::Render, std::move(surface), overlay_plane_data, size_));
} else {
overlay_plane->Render(base::DoNothingAs<void(gfx::OverlayRenderData)>());
}