[svn] / branches / dev-api-4 / xvidcore / dshow / src / CXvidDecoder.cpp Repository:
ViewVC logotype

Diff of /branches/dev-api-4/xvidcore/dshow/src/CXvidDecoder.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1260, Fri Dec 12 15:09:01 2003 UTC revision 1343, Fri Jan 30 13:13:10 2004 UTC
# Line 19  Line 19 
19   *  along with this program ; if not, write to the Free Software   *  along with this program ; if not, write to the Free Software
20   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21   *   *
22   * $Id: CXvidDecoder.cpp,v 1.1.2.5 2003-12-12 15:09:01 Isibaar Exp $   * $Id: CXvidDecoder.cpp,v 1.1.2.15 2004-01-30 13:13:10 syskin Exp $
23   *   *
24   ****************************************************************************/   ****************************************************************************/
25    
# Line 63  Line 63 
63    
64  // Externs defined here  // Externs defined here
65  PostProcessing_Settings PPSettings;  PostProcessing_Settings PPSettings;
66    unsigned int supported_4cc;
67  int rgb_flip;  int rgb_flip;
68    
69    
70  bool USE_IYUV;  bool USE_IYUV;
71  bool USE_YV12;  bool USE_YV12;
72  bool USE_YUY2;  bool USE_YUY2;
# Line 84  Line 85 
85          { &MEDIATYPE_Video, &CLSID_DIVX_UC },          { &MEDIATYPE_Video, &CLSID_DIVX_UC },
86          { &MEDIATYPE_Video, &CLSID_DX50 },          { &MEDIATYPE_Video, &CLSID_DX50 },
87          { &MEDIATYPE_Video, &CLSID_DX50_UC },          { &MEDIATYPE_Video, &CLSID_DX50_UC },
88            { &MEDIATYPE_Video, &CLSID_MP4V },
89  };  };
90    
91  const AMOVIESETUP_MEDIATYPE sudOutputPinTypes[] =  const AMOVIESETUP_MEDIATYPE sudOutputPinTypes[] =
# Line 201  Line 203 
203    
204  /* constructor */  /* constructor */
205    
206    #define XVID_DLL_NAME "xvidcore.dll"
207    
208  CXvidDecoder::CXvidDecoder(LPUNKNOWN punk, HRESULT *phr) :  CXvidDecoder::CXvidDecoder(LPUNKNOWN punk, HRESULT *phr) :
209      CVideoTransformFilter(NAME("CXvidDecoder"), punk, CLSID_XVID)      CVideoTransformFilter(NAME("CXvidDecoder"), punk, CLSID_XVID)
210  {  {
# Line 209  Line 213 
213          xvid_gbl_init_t init;          xvid_gbl_init_t init;
214          memset(&init, 0, sizeof(init));          memset(&init, 0, sizeof(init));
215          init.version = XVID_VERSION;          init.version = XVID_VERSION;
216          if (xvid_global(0, XVID_GBL_INIT, &init, NULL) < 0)  
217            ar_x = ar_y = 0;
218    
219            m_hdll = LoadLibrary(XVID_DLL_NAME);
220            if (m_hdll == NULL) {
221                    DPRINTF("dll load failed");
222                    MessageBox(0, XVID_DLL_NAME " not found","Error", 0);
223                    return;
224            }
225    
226            xvid_global_func = (int (__cdecl *)(void *, int, void *, void *))GetProcAddress(m_hdll, "xvid_global");
227            if (xvid_global_func == NULL) {
228                    MessageBox(0, "xvid_global() not found", "Error", 0);
229                    return;
230            }
231    
232            xvid_decore_func = (int (__cdecl *)(void *, int, void *, void *))GetProcAddress(m_hdll, "xvid_decore");
233            if (xvid_decore_func == NULL) {
234                    MessageBox(0, "xvid_decore() not found", "Error", 0);
235                    return;
236            }
237    
238            if (xvid_global_func(0, XVID_GBL_INIT, &init, NULL) < 0)
239          {          {
240                  MessageBox(0, "xvid_global() failed", "Error", 0);                  MessageBox(0, "xvid_global() failed", "Error", 0);
241                  return;                  return;
# Line 228  Line 254 
254    
255          // Set the default post-processing settings          // Set the default post-processing settings
256          REG_GET_N("Brightness", PPSettings.nBrightness, 25)          REG_GET_N("Brightness", PPSettings.nBrightness, 25)
257          REG_GET_N("Deblock_Y",  PPSettings.bDeblock_Y, 0)          REG_GET_N("Deblock_Y",  PPSettings.nDeblock_Y, 0)
258          REG_GET_N("Deblock_UV", PPSettings.bDeblock_UV, 0)          REG_GET_N("Deblock_UV", PPSettings.nDeblock_UV, 0)
259            REG_GET_N("Dering",  PPSettings.nDering, 0)
260            REG_GET_N("FilmEffect", PPSettings.nFilmEffect, 0)
261          REG_GET_N("ForceColorspace", PPSettings.nForceColorspace, 0)          REG_GET_N("ForceColorspace", PPSettings.nForceColorspace, 0)
262            REG_GET_N("FlipVideo",  PPSettings.nFlipVideo, 0)
263            REG_GET_N("Supported_4CC",  supported_4cc, 0)
264    
265          RegCloseKey(hKey);          RegCloseKey(hKey);
266    
# Line 283  Line 313 
313    
314          if (m_create.handle != NULL)          if (m_create.handle != NULL)
315          {          {
316                  xvid_decore(m_create.handle, XVID_DEC_DESTROY, 0, 0);                  xvid_decore_func(m_create.handle, XVID_DEC_DESTROY, 0, 0);
317                  m_create.handle = NULL;                  m_create.handle = NULL;
318          }          }
319    
320            if (m_hdll != NULL)
321            {
322                    FreeLibrary(m_hdll);
323                    m_hdll = NULL;
324            }
325  }  }
326    
327    
# Line 307  Line 343 
343          {          {
344                  VIDEOINFOHEADER * vih = (VIDEOINFOHEADER *) mtIn->Format();                  VIDEOINFOHEADER * vih = (VIDEOINFOHEADER *) mtIn->Format();
345                  hdr = &vih->bmiHeader;                  hdr = &vih->bmiHeader;
346                    /* PAR (x:y) is (1/ppm_X):(1/ppm_Y) where ppm is pixels-per-meter
347                       which is equal to ppm_Y:ppm_X */
348                    ar_x = vih->bmiHeader.biYPelsPerMeter*hdr->biWidth;
349                    ar_y = vih->bmiHeader.biXPelsPerMeter*hdr->biHeight;
350          }          }
351          else if (*mtIn->FormatType() == FORMAT_VideoInfo2)          else if (*mtIn->FormatType() == FORMAT_VideoInfo2)
352          {          {
353                  VIDEOINFOHEADER2 * vih2 = (VIDEOINFOHEADER2 *) mtIn->Format();                  VIDEOINFOHEADER2 * vih2 = (VIDEOINFOHEADER2 *) mtIn->Format();
354                  hdr = &vih2->bmiHeader;                  hdr = &vih2->bmiHeader;
355                    ar_x = vih2->dwPictAspectRatioX;
356                    ar_y = vih2->dwPictAspectRatioY;
357          }          }
358          else          else
359          {          {
# Line 329  Line 371 
371    
372          switch(hdr->biCompression)          switch(hdr->biCompression)
373          {          {
374    
375            case FOURCC_MP4V:
376                    if (!(supported_4cc & SUPPORT_MP4V)) return VFW_E_TYPE_NOT_ACCEPTED;
377                    break;
378            case FOURCC_DIVX :
379                    if (!(supported_4cc & SUPPORT_DIVX)) return VFW_E_TYPE_NOT_ACCEPTED;
380                    break;
381            case FOURCC_DX50 :
382                    if (!(supported_4cc & SUPPORT_DX50)) return VFW_E_TYPE_NOT_ACCEPTED;
383          case FOURCC_XVID :          case FOURCC_XVID :
 //      case FOURCC_DIVX :  
 //      case FOURCC_DX50 :  
384                  break;                  break;
385    
386    
387          default :          default :
388                  DPRINTF("Unknown fourcc: 0x%08x (%c%c%c%c)",                  DPRINTF("Unknown fourcc: 0x%08x (%c%c%c%c)",
389                          hdr->biCompression,                          hdr->biCompression,
# Line 343  Line 393 
393                          (hdr->biCompression>>24)&0xff);                          (hdr->biCompression>>24)&0xff);
394                  return VFW_E_TYPE_NOT_ACCEPTED;                  return VFW_E_TYPE_NOT_ACCEPTED;
395          }          }
   
396          return S_OK;          return S_OK;
397  }  }
398    
# Line 360  Line 409 
409                  return E_UNEXPECTED;                  return E_UNEXPECTED;
410          }          }
411    
412          VIDEOINFOHEADER * vih = (VIDEOINFOHEADER *) mtOut->ReallocFormatBuffer(sizeof(VIDEOINFOHEADER));          VIDEOINFOHEADER2 * vih = (VIDEOINFOHEADER2 *) mtOut->ReallocFormatBuffer(sizeof(VIDEOINFOHEADER2));
413          if (vih == NULL)          if (vih == NULL)
414          {          {
415                  return E_OUTOFMEMORY;                  return E_OUTOFMEMORY;
# Line 379  Line 428 
428    
429          switch(iPosition)          switch(iPosition)
430          {          {
431    
432          case 0  :          case 0  :
 if ( USE_IYUV )  
 {  
                 vih->bmiHeader.biCompression = CLSID_MEDIASUBTYPE_IYUV.Data1;  
                 vih->bmiHeader.biBitCount = 12;  
                 mtOut->SetSubtype(&CLSID_MEDIASUBTYPE_IYUV);  
                 break;  
 }  
         case 1  :  
 if ( USE_YV12 )  
 {  
                 vih->bmiHeader.biCompression = MEDIASUBTYPE_YV12.Data1;  
                 vih->bmiHeader.biBitCount = 12;  
                 mtOut->SetSubtype(&MEDIASUBTYPE_YV12);  
                 break;  
 }  
         case 2:  
433  if ( USE_YUY2 )  if ( USE_YUY2 )
434  {  {
435                  vih->bmiHeader.biCompression = MEDIASUBTYPE_YUY2.Data1;                  vih->bmiHeader.biCompression = MEDIASUBTYPE_YUY2.Data1;
# Line 403  Line 437 
437                  mtOut->SetSubtype(&MEDIASUBTYPE_YUY2);                  mtOut->SetSubtype(&MEDIASUBTYPE_YUY2);
438                  break;                  break;
439  }  }
440          case 3 :          case 1 :
441  if ( USE_YVYU )  if ( USE_YVYU )
442  {  {
443                  vih->bmiHeader.biCompression = MEDIASUBTYPE_YVYU.Data1;                  vih->bmiHeader.biCompression = MEDIASUBTYPE_YVYU.Data1;
# Line 411  Line 445 
445                  mtOut->SetSubtype(&MEDIASUBTYPE_YVYU);                  mtOut->SetSubtype(&MEDIASUBTYPE_YVYU);
446                  break;                  break;
447  }  }
448          case 4 :          case 2 :
449  if ( USE_UYVY )  if ( USE_UYVY )
450  {  {
451                  vih->bmiHeader.biCompression = MEDIASUBTYPE_UYVY.Data1;                  vih->bmiHeader.biCompression = MEDIASUBTYPE_UYVY.Data1;
# Line 419  Line 453 
453                  mtOut->SetSubtype(&MEDIASUBTYPE_UYVY);                  mtOut->SetSubtype(&MEDIASUBTYPE_UYVY);
454                  break;                  break;
455  }  }
456            case 3  :
457                    if ( USE_IYUV )
458    {
459                    vih->bmiHeader.biCompression = CLSID_MEDIASUBTYPE_IYUV.Data1;
460                    vih->bmiHeader.biBitCount = 12;
461                    mtOut->SetSubtype(&CLSID_MEDIASUBTYPE_IYUV);
462                    break;
463    }
464            case 4  :
465    if ( USE_YV12 )
466    {
467                    vih->bmiHeader.biCompression = MEDIASUBTYPE_YV12.Data1;
468                    vih->bmiHeader.biBitCount = 12;
469                    mtOut->SetSubtype(&MEDIASUBTYPE_YV12);
470                    break;
471    }
472          case 5 :          case 5 :
473  if ( USE_RGB32 )  if ( USE_RGB32 )
474  {  {
# Line 457  Line 507 
507    
508          vih->bmiHeader.biSizeImage = GetBitmapSize(&vih->bmiHeader);          vih->bmiHeader.biSizeImage = GetBitmapSize(&vih->bmiHeader);
509    
510            if (ar_x != 0 && ar_y != 0) {
511                    vih->dwPictAspectRatioX = ar_x;
512                    vih->dwPictAspectRatioY = ar_y;
513            } else { // just to be safe
514                    vih->dwPictAspectRatioX = m_create.width;
515                    vih->dwPictAspectRatioY = m_create.height;
516            }
517    
518          mtOut->SetType(&MEDIATYPE_Video);          mtOut->SetType(&MEDIATYPE_Video);
519          mtOut->SetFormatType(&FORMAT_VideoInfo);          mtOut->SetFormatType(&FORMAT_VideoInfo2);
520          mtOut->SetTemporalCompression(FALSE);          mtOut->SetTemporalCompression(FALSE);
521          mtOut->SetSampleSize(vih->bmiHeader.biSizeImage);          mtOut->SetSampleSize(vih->bmiHeader.biSizeImage);
522    
# Line 490  Line 548 
548          if (subtype == CLSID_MEDIASUBTYPE_IYUV)          if (subtype == CLSID_MEDIASUBTYPE_IYUV)
549          {          {
550                  DPRINTF("IYUV");                  DPRINTF("IYUV");
551                    rgb_flip = 0;
552                  m_frame.output.csp = XVID_CSP_I420;                  m_frame.output.csp = XVID_CSP_I420;
553                  m_frame.output.stride[0] = (m_frame.output.stride[0] * 2) / 3;  /* planar format fix */                  m_frame.output.stride[0] = (m_frame.output.stride[0] * 2) / 3;  /* planar format fix */
554          }          }
555          else if (subtype == MEDIASUBTYPE_YV12)          else if (subtype == MEDIASUBTYPE_YV12)
556          {          {
557                  DPRINTF("YV12");                  DPRINTF("YV12");
558                    rgb_flip = 0;
559                  m_frame.output.csp = XVID_CSP_YV12;                  m_frame.output.csp = XVID_CSP_YV12;
560                  m_frame.output.stride[0] = (m_frame.output.stride[0] * 2) / 3;  /* planar format fix */                  m_frame.output.stride[0] = (m_frame.output.stride[0] * 2) / 3;  /* planar format fix */
561          }          }
562          else if (subtype == MEDIASUBTYPE_YUY2)          else if (subtype == MEDIASUBTYPE_YUY2)
563          {          {
564                  DPRINTF("YUY2");                  DPRINTF("YUY2");
565                    rgb_flip = 0;
566                  m_frame.output.csp = XVID_CSP_YUY2;                  m_frame.output.csp = XVID_CSP_YUY2;
567          }          }
568          else if (subtype == MEDIASUBTYPE_YVYU)          else if (subtype == MEDIASUBTYPE_YVYU)
569          {          {
570                  DPRINTF("YVYU");                  DPRINTF("YVYU");
571                    rgb_flip = 0;
572                  m_frame.output.csp = XVID_CSP_YVYU;                  m_frame.output.csp = XVID_CSP_YVYU;
573          }          }
574          else if (subtype == MEDIASUBTYPE_UYVY)          else if (subtype == MEDIASUBTYPE_UYVY)
575          {          {
576                  DPRINTF("UYVY");                  DPRINTF("UYVY");
577                    rgb_flip = 0;
578                  m_frame.output.csp = XVID_CSP_UYVY;                  m_frame.output.csp = XVID_CSP_UYVY;
579          }          }
580          else if (subtype == MEDIASUBTYPE_RGB32)          else if (subtype == MEDIASUBTYPE_RGB32)
# Line 618  Line 681 
681    
682          if (m_create.handle == NULL)          if (m_create.handle == NULL)
683          {          {
684                  if (xvid_decore(0, XVID_DEC_CREATE, &m_create, 0) < 0)                  if (xvid_decore_func(0, XVID_DEC_CREATE, &m_create, 0) < 0)
685                  {                  {
686              DPRINTF("*** XVID_DEC_CREATE error");              DPRINTF("*** XVID_DEC_CREATE error");
687                          return S_FALSE;                          return S_FALSE;
# Line 657  Line 720 
720          if (pIn->IsDiscontinuity() == S_OK)          if (pIn->IsDiscontinuity() == S_OK)
721                  m_frame.general = XVID_DISCONTINUITY;                  m_frame.general = XVID_DISCONTINUITY;
722    
723          if (PPSettings.bDeblock_Y)          if (PPSettings.nDeblock_Y)
724                  m_frame.general |= XVID_DEBLOCKY;                  m_frame.general |= XVID_DEBLOCKY;
725    
726          if (PPSettings.bDeblock_UV)          if (PPSettings.nDeblock_UV)
727                  m_frame.general |= XVID_DEBLOCKUV;                  m_frame.general |= XVID_DEBLOCKUV;
728    /*
729            if (PPSettings.nDering)
730                    m_frame.general |= XVID_DERING;
731    */
732            if (PPSettings.nFilmEffect)
733                    m_frame.general |= XVID_FILMEFFECT;
734    
         if (PPSettings.bFlipVideo) {  
                 if (rgb_flip)  
                         m_frame.output.csp &= ~XVID_CSP_VFLIP;  
                 else  
                         m_frame.output.csp |= XVID_CSP_VFLIP;  
         }  
         else {  
                 if (rgb_flip)  
                         m_frame.output.csp |= XVID_CSP_VFLIP;  
                 else  
735                          m_frame.output.csp &= ~XVID_CSP_VFLIP;                          m_frame.output.csp &= ~XVID_CSP_VFLIP;
736          }          m_frame.output.csp |= rgb_flip^(PPSettings.nFlipVideo ? XVID_CSP_VFLIP : 0);
737    
738  repeat :  repeat :
739    
740          if (pIn->IsPreroll() != S_OK)          if (pIn->IsPreroll() != S_OK)
741          {          {
742                  length = xvid_decore(m_create.handle, XVID_DEC_DECODE, &m_frame, &stats);                  length = xvid_decore_func(m_create.handle, XVID_DEC_DECODE, &m_frame, &stats);
743    
744                  if (length < 0)                  if (length < 0)
745                  {                  {
# Line 689  Line 748 
748                  }                  }
749          }          }
750          else          else
751          {          {       /* Preroll frame - won't be displayed */
752                  int tmp = m_frame.output.csp;                  int tmp = m_frame.output.csp;
753                    int tmp_gen = m_frame.general;
754    
755                  m_frame.output.csp = XVID_CSP_NULL;                  m_frame.output.csp = XVID_CSP_NULL;
756    
757                  length = xvid_decore(m_create.handle, XVID_DEC_DECODE, &m_frame, &stats);                  /* Disable postprocessing to speed-up seeking */
758                    m_frame.general &= ~XVID_DEBLOCKY;
759                    m_frame.general &= ~XVID_DEBLOCKUV;
760    /*              m_frame.general &= ~XVID_DERING; */
761                    m_frame.general &= ~XVID_FILMEFFECT;
762    
763                    length = xvid_decore_func(m_create.handle, XVID_DEC_DECODE, &m_frame, &stats);
764                  if (length < 0)                  if (length < 0)
765                  {                  {
766              DPRINTF("*** XVID_DEC_DECODE");              DPRINTF("*** XVID_DEC_DECODE");
# Line 701  Line 768 
768                  }                  }
769    
770                  m_frame.output.csp = tmp;                  m_frame.output.csp = tmp;
771                    m_frame.general = tmp_gen;
772          }          }
773    
774          if (stats.type == XVID_TYPE_NOTHING) {          if (stats.type == XVID_TYPE_NOTHING && length > 0) {
775                  DPRINTF("B-Frame decoder lag");                  DPRINTF("B-Frame decoder lag");
776                  return S_FALSE;                  return S_FALSE;
777          }          }
# Line 718  Line 786 
786                          return S_FALSE;                          return S_FALSE;
787                  }                  }
788    
789                    pOut->SetDiscontinuity(TRUE);
790                    pOut->SetSyncPoint(TRUE);
791    
792                  m_frame.bitstream = (BYTE*)m_frame.bitstream + length;                  m_frame.bitstream = (BYTE*)m_frame.bitstream + length;
793                  m_frame.length -= length;                  m_frame.length -= length;
794                  goto repeat;                  goto repeat;
795          }          }
796    
797            if (pIn->IsPreroll() == S_OK) {
798                    return S_FALSE;
799            }
800    
801          return S_OK;          return S_OK;
802  }  }
803    

Legend:
Removed from v.1260  
changed lines
  Added in v.1343

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4