static int GetSubSamplingW(const VideoInfo &vi) { if (vi.IsYUV() && vi.IsPlanar()) return vi.GetPlaneWidthSubsampling(PLANAR_U); else return 0; }
int AvxContext::OutputVideo() { FILE *sink; unsigned char *writeBuffer = NULL; sighandler_t old_sigpipe = signal(SIGPIPE, SIG_IGN); if (launchMPlayer) { char command[1024]; if (MPlayerCommandVideo(command)) return -1; AVXLOG_INFO("MPlayer command line: %s", command); sink = popen(command, "w"); if (!sink) { AVXLOG_ERROR("%s", "Error starting mplayer"); return -1; } } else { sink = stdout; } writeBuffer = (unsigned char *)malloc(vi.RowSize() * vi.height); if (!writeBuffer) { AVXLOG_ERROR("%s", "Unable to allocate memory"); goto fail; } try { for (int i = 0; i < vi.num_frames; ++i) { if (launchMPlayer && (feof(sink) || ferror(sink))) { AVXLOG_ERROR("%s", "mplayer process exited"); break; } PVideoFrame frame = clip->GetFrame(i, avx_library.env); if (vi.IsPlanar()) { // Check plane count in 2.6. int planes[] = {PLANAR_Y, PLANAR_V, PLANAR_U}; for (int j = 0; j < 3; ++j) { int plane = planes[j]; int src_pitch = frame->GetPitch(plane); int row_size = frame->GetRowSize(plane); int height = frame->GetHeight(plane); const unsigned char *srcp = frame->GetReadPtr(plane); avx_library.env->BitBlt(writeBuffer, row_size, srcp, src_pitch, row_size, height); fwrite(writeBuffer, 1, row_size * height, sink); } } else { int src_pitch = frame->GetPitch(); int row_size = frame->GetRowSize(); int height = frame->GetHeight(); const unsigned char *srcp = frame->GetReadPtr(); avx_library.env->BitBlt(writeBuffer, row_size, srcp, src_pitch, row_size, height); fwrite(writeBuffer, 1, row_size * height, sink); } } } catch (AvisynthError &e) { AVXLOG_ERROR("AvisynthError: %s", e.msg); goto fail; } free(writeBuffer); if (launchMPlayer) pclose(sink); signal(SIGPIPE, old_sigpipe); return 0; fail: if (writeBuffer) free(writeBuffer); if (launchMPlayer) pclose(sink); signal(SIGPIPE, old_sigpipe); return -1; };