--- branches/dev-api-3/vfw/src/codec.c 2002/10/24 07:28:18 609 +++ branches/dev-api-3/vfw/src/codec.c 2002/11/08 10:11:48 634 @@ -130,7 +130,7 @@ case FOURCC_YV12 : DEBUG("YV12"); return XVID_CSP_YV12; - + case FOURCC_YUYV : case FOURCC_YUY2 : DEBUG("YUY2"); @@ -172,7 +172,7 @@ } if (inhdr->biWidth != outhdr->biWidth || inhdr->biHeight != outhdr->biHeight || - (outhdr->biCompression != FOURCC_XVID && outhdr->biCompression != FOURCC_DIVX)) + (outhdr->biCompression != FOURCC_XVID && outhdr->biCompression != FOURCC_DIVX && outhdr->biCompression != FOURCC_DX50)) { return ICERR_BADFORMAT; } @@ -236,13 +236,6 @@ // DEBUG2("frate fscale", codec->frate, codec->fscale); codec->fincr = icf->dwScale; codec->fbase = icf->dwRate; - - if (codec->fbase == 0 || codec->fincr == 0) - { - codec->fbase = 25; - codec->fincr = 1; - } - return ICERR_OK; } @@ -458,6 +451,8 @@ frame.motion = pmvfast_presets[codec->config.motion_search]; frame.image = icc->lpInput; + // dev-api-3 + frame.stride = (((icc->lpbiInput->biWidth * icc->lpbiInput->biBitCount) + 31) & ~31) >> 3; if ((frame.colorspace = get_colorspace(inhdr)) == XVID_CSP_NULL) return ICERR_BADFORMAT; @@ -616,7 +611,10 @@ return ICERR_ERROR; } - if (inhdr->biCompression != FOURCC_XVID && inhdr->biCompression != FOURCC_DIVX) + if (inhdr->biCompression != FOURCC_XVID && + inhdr->biCompression != FOURCC_DIVX && + inhdr->biCompression != FOURCC_DX50 && + get_colorspace(inhdr) == XVID_CSP_NULL) { return ICERR_BADFORMAT; } @@ -648,6 +646,14 @@ return sizeof(BITMAPINFOHEADER); } + /* --- yv12 --- */ + if (get_colorspace(inhdr) != XVID_CSP_NULL) { + memcpy(outhdr, inhdr, sizeof(BITMAPINFOHEADER)); + // XXX: should we set outhdr->biSize ?? + return ICERR_OK; + } + /* --- yv12 --- */ + result = decompress_query(codec, lpbiInput, lpbiOutput); if (result != ICERR_OK) { @@ -719,7 +725,43 @@ frame.length = icd->lpbiInput->biSizeImage; frame.image = icd->lpOutput; - frame.stride = icd->lpbiOutput->biWidth; + //frame.stride = icd->lpbiOutput->biWidth; + // dev-api-3: + frame.stride = (((icd->lpbiOutput->biWidth * icd->lpbiOutput->biBitCount) + 31) & ~31) >> 3; + + /* --- yv12 --- */ + if (icd->lpbiInput->biCompression != FOURCC_XVID && + icd->lpbiInput->biCompression != FOURCC_DIVX && + icd->lpbiInput->biCompression != FOURCC_DX50) + { + XVID_INIT_CONVERTINFO convert; + + DEBUGFOURCC("input", icd->lpbiInput->biCompression); + DEBUGFOURCC("output", icd->lpbiOutput->biCompression); + + convert.input.colorspace = get_colorspace(icd->lpbiInput); + convert.input.y = icd->lpInput; + convert.input.y_stride = (((icd->lpbiInput->biWidth * icd->lpbiInput->biBitCount) + 31) & ~31) >> 3; + + convert.output.colorspace = get_colorspace(icd->lpbiOutput); + convert.output.y = icd->lpOutput; + convert.output.y_stride = (((icd->lpbiOutput->biWidth * icd->lpbiOutput->biBitCount) + 31) & ~31) >> 3; + + convert.width = icd->lpbiInput->biWidth; + convert.height = icd->lpbiInput->biHeight; + convert.interlacing = 0; + + if (convert.input.colorspace == XVID_CSP_NULL || + convert.output.colorspace == XVID_CSP_NULL || + xvid_init(NULL, XVID_INIT_CONVERT, &convert, NULL) != XVID_ERR_OK) + { + return ICERR_BADFORMAT; + } + + return ICERR_OK; + } + /* --- yv12 --- */ + if (~((icd->dwFlags & ICDECOMPRESS_HURRYUP) | (icd->dwFlags & ICDECOMPRESS_UPDATE) | (icd->dwFlags & ICDECOMPRESS_PREROLL))) {