Ticket #1724: resizevideo.patch
File resizevideo.patch, 8.0 KB (added by , 20 years ago) |
---|
-
mythtv/libs/libmythtv/NuppelVideoPlayer.cpp
6247 6247 } 6248 6248 // EIA-708 caption support -- end 6249 6249 6250 void NuppelVideoPlayer::SetVideoResize(const QRect &videoRect) 6251 { 6252 if (videoOutput) 6253 videoOutput->SetVideoResize(videoRect); 6254 } 6255 6250 6256 /* vim: set expandtab tabstop=4 shiftwidth=4: */ -
mythtv/libs/libmythtv/NuppelVideoPlayer.h
158 158 159 159 void SetOSDFontName(const QString osdfonts[22], const QString &prefix); 160 160 void SetOSDThemeName(const QString themename); 161 void SetVideoResize(const QRect &videoRect); 161 162 162 163 // Toggle Sets 163 164 void ToggleLetterbox(int letterboxMode = -1); -
mythtv/libs/libmythtv/videooutbase.cpp
175 175 piph_out(-1), pipw_out(-1), 176 176 piptmpbuf(NULL), pipscontext(NULL), 177 177 178 // Video resizing 179 resizew_in(-1), resizeh_in(-1), 180 resizew_out(-1), resizeh_out(-1), 181 videoResizeSize(0,0,0,0), videotmpbuf(NULL), 182 videoscontext(NULL), resizeVideo(false), 183 178 184 // Deinterlacing 179 185 m_deinterlacing(false), m_deintfiltername("linearblend"), 180 186 m_deintFiltMan(NULL), m_deintFilter(NULL), … … 198 204 { 199 205 ShutdownPipResize(); 200 206 207 ShutdownVideoResize(); 208 201 209 if (m_deintFilter) 202 210 delete m_deintFilter; 203 211 if (m_deintFiltMan) … … 1188 1196 pipplayer->ReleaseCurrentFrame(pipimage); 1189 1197 } 1190 1198 1199 void VideoOutput::DoVideoResize(int video_width, int video_height, int desired_width, int desired_height) 1200 { 1201 if (video_width != resizew_in || 1202 video_height != resizeh_in || 1203 desired_width != resizew_out || 1204 desired_height!= resizeh_out ) 1205 { 1206 ShutdownVideoResize(); 1207 1208 videotmpbuf = new unsigned char[desired_height * desired_width * 3 / 2]; 1209 1210 resizeh_in = video_height; 1211 resizew_in = video_width; 1212 resizew_out = desired_width; 1213 resizeh_out = desired_height; 1214 1215 videoscontext = img_resample_init(resizew_out, resizeh_out, resizew_in, resizeh_in); 1216 } 1217 } 1218 1219 void VideoOutput::ResizeVideo(VideoFrame *frame) 1220 { 1221 if (videoResizeSize.isNull() || frame->codec != FMT_YV12) 1222 return; 1223 1224 QRect resize = videoResizeSize; 1225 1226 // if resize is outside existing frame, abort 1227 if((resize.right() > frame->width || 1228 resize.bottom() > frame->height || 1229 resize.width() > frame->width || 1230 resize.height() > frame->height)) 1231 { 1232 resizeVideo = false; 1233 ShutdownVideoResize(); 1234 videoResizeSize.setRect(0,0,0,0); 1235 return; 1236 } 1237 // if resize = existing frame size, no need to carry on 1238 if(resize.left() == 0 && 1239 resize.top() == 0 && 1240 (resize.width() == frame->width) && 1241 (resize.height() == frame->height)) 1242 { 1243 resizeVideo = false; 1244 ShutdownVideoResize(); 1245 videoResizeSize.setRect(0,0,0,0); 1246 return; 1247 } 1248 DoVideoResize(frame->width, frame->height, resize.width(), resize.height()); 1249 if (videotmpbuf && videoscontext) 1250 { 1251 AVPicture img_in, img_out; 1252 1253 avpicture_fill(&img_out, (uint8_t *)videotmpbuf, PIX_FMT_YUV420P, 1254 resize.width(), resize.height()); 1255 avpicture_fill(&img_in, (uint8_t *)frame->buf, PIX_FMT_YUV420P, 1256 frame->width, frame->height); 1257 img_resample(videoscontext, &img_out, &img_in); 1258 } 1259 1260 int xoff = resize.left(); 1261 int yoff = resize.top(); 1262 int resw = resize.width(); 1263 // Copy Y (intensity values) 1264 for (int i = 0; i < resize.height(); i++) 1265 { 1266 memcpy(frame->buf + (i + yoff) * frame->width + xoff, 1267 videotmpbuf + i * resw, resw); 1268 } 1269 // Copy U & V (half plane chroma values) 1270 xoff /= 2; 1271 yoff /= 2; 1272 1273 unsigned char *uptr = frame->buf + frame->width * frame->height; 1274 unsigned char *vptr = frame->buf + frame->width * frame->height * 5 / 4; 1275 int vidw = frame->width / 2; 1276 1277 unsigned char *videouptr = videotmpbuf + resw * resize.height(); 1278 unsigned char *videovptr = videotmpbuf + resw * resize.height() * 5 / 4; 1279 resw /= 2; 1280 for (int i = 0; i < resize.height() / 2; i ++) 1281 { 1282 memcpy(uptr + (i + yoff) * vidw + xoff, videouptr + i * resw, resw); 1283 memcpy(vptr + (i + yoff) * vidw + xoff, videovptr + i * resw, resw); 1284 } 1285 } 1286 1287 void VideoOutput::ShutdownVideoResize(void) 1288 { 1289 if (videotmpbuf) 1290 delete [] videotmpbuf; 1291 if (videoscontext) 1292 img_resample_close(videoscontext); 1293 1294 videotmpbuf = NULL; 1295 videoscontext = NULL; 1296 1297 resizeh_in = resizeh_out = -1; 1298 resizew_in = resizew_out = -1; 1299 1300 } 1301 1302 void VideoOutput::SetVideoResize(const QRect &videoRect) 1303 { 1304 if (!videoRect.isValid() || 1305 videoRect.width() < 1 || 1306 videoRect.height() < 1 || 1307 videoRect.left() < 0 || 1308 videoRect.top() < 0 ) 1309 { 1310 resizeVideo = false; 1311 ShutdownVideoResize(); 1312 videoResizeSize.setRect(0,0,0,0); 1313 return; 1314 } 1315 resizeVideo = true; 1316 videoResizeSize = videoRect; 1317 } 1318 1191 1319 /** 1192 1320 * \fn VideoOutput::DisplayOSD(VideoFrame*,OSD *,int,int) 1193 1321 * \brief If the OSD has changed, this will convert the OSD buffer … … 1204 1332 if (!osd) 1205 1333 return -1; 1206 1334 1335 if(resizeVideo) 1336 ResizeVideo(frame); 1337 1207 1338 OSDSurface *surface = osd->Display(); 1208 1339 if (!surface) 1209 1340 return -1; -
mythtv/libs/libmythtv/videooutbase.h
310 310 /// \brief Updates frame displayed when video is paused. 311 311 virtual void UpdatePauseFrame(void) = 0; 312 312 313 /// \brief Tells the player to resize the video frame (used for interactive) 314 void SetVideoResize(const QRect &videoRect); 315 313 316 protected: 314 317 void InitBuffers(int numdecode, bool extra_for_pause, int need_free, 315 318 int needprebuffer_normal, int needprebuffer_small, … … 327 330 void DoPipResize(int pipwidth, int pipheight); 328 331 void ShutdownPipResize(void); 329 332 333 void ShutdownVideoResize(void); 334 void ResizeVideo(VideoFrame *frame); 335 void DoVideoResize(int video_width, int video_height, int desired_width, int desired_height); 336 330 337 void SetVideoAspectRatio(float aspect); 331 338 332 339 /// Physical width of playback window in millimeters, used to compute display_aspect … … 391 398 unsigned char *piptmpbuf; 392 399 ImgReSampleContext *pipscontext; 393 400 401 // video resizing 402 int resizew_in; 403 int resizeh_in; 404 int resizew_out; 405 int resizeh_out; 406 QRect videoResizeSize; 407 unsigned char *videotmpbuf; 408 ImgReSampleContext *videoscontext; 409 bool resizeVideo; 410 394 411 // Deinterlacing 395 412 bool m_deinterlacing; 396 413 QString m_deintfiltername; -
mythtv/libs/libmythtv/mhi.cpp
415 415 // e.g. part of the video may be clipped within the displayRect. 416 416 void MHIContext::DrawVideo(const QRect &videoRect, const QRect &dispRect) 417 417 { 418 (void) videoRect; 418 // tell the video player to resize the video stream 419 if (m_parent->GetNVP()) 420 m_parent->GetNVP()->SetVideoResize(videoRect); 419 421 420 422 QMutexLocker locker(&m_display_lock); 421 423 QRect displayRect(dispRect.x() * m_displayWidth/StdDisplayWidth,