[svn] / branches / dev-api-4 / xvidcore / vfw / src / codec.c Repository:
ViewVC logotype

Diff of /branches/dev-api-4/xvidcore/vfw/src/codec.c

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

revision 1305, Sat Jan 3 12:06:11 2004 UTC revision 1329, Sat Jan 24 13:36:00 2004 UTC
# Line 271  Line 271 
271                           void *param2)                           void *param2)
272  {  {
273          switch (opt) {          switch (opt) {
         case XVID_PLG_INFO:  
274          case XVID_PLG_CREATE:          case XVID_PLG_CREATE:
275                    *((void**)param2) = NULL;
276            case XVID_PLG_INFO:
277          case XVID_PLG_DESTROY:          case XVID_PLG_DESTROY:
278          case XVID_PLG_BEFORE:          case XVID_PLG_BEFORE:
279                  return 0;                  return 0;
# Line 309  Line 310 
310          m_hdll = LoadLibrary(XVID_DLL_NAME);          m_hdll = LoadLibrary(XVID_DLL_NAME);
311          if (m_hdll == NULL) {          if (m_hdll == NULL) {
312                  DPRINTF("dll load failed");                  DPRINTF("dll load failed");
313                  MessageBox(0, XVID_DLL_NAME " not found","Error", 0);                  MessageBox(0, XVID_DLL_NAME " not found!","Error!", MB_ICONEXCLAMATION|MB_OK);
314                  return XVID_ERR_FAIL;                  return XVID_ERR_FAIL;
315          }          }
316    
# Line 345  Line 346 
346          return 0;          return 0;
347  }  }
348    
349    void
350    sort_zones(zone_t * zones, int zone_num, int * sel);
351    
352    static void
353    prepare_cquant_zones(CONFIG * config) {
354    
355            int i = 0;
356            if (config->num_zones == 0 || config->zones[0].frame != 0) {
357                    /* first zone does not start at frame 0 or doesn't exist */
358    
359                    if (config->num_zones >= MAX_ZONES) config->num_zones--; /* we scrifice last zone */
360    
361                    config->zones[config->num_zones].frame = 0;
362                    config->zones[config->num_zones].mode = RC_ZONE_QUANT;
363                    config->zones[config->num_zones].weight = 100;
364                    config->zones[config->num_zones].quant = config->desired_quant;
365                    config->zones[config->num_zones].type = XVID_TYPE_AUTO;
366                    config->zones[config->num_zones].greyscale = 0;
367                    config->zones[config->num_zones].chroma_opt = 0;
368                    config->zones[config->num_zones].bvop_threshold = 0;
369                    config->num_zones++;
370    
371                    sort_zones(config->zones, config->num_zones, &i);
372            }
373    
374            /* step 2: let's change all weight zones into quant zones */
375    
376            for(i = 0; i < config->num_zones; i++)
377                    if (config->zones[i].mode == RC_ZONE_WEIGHT) {
378                            config->zones[i].mode = RC_ZONE_QUANT;
379                            config->zones[i].quant = (100*config->desired_quant) / config->zones[i].weight;
380                    }
381    }
382    
383    
384  LRESULT compress_begin(CODEC * codec, BITMAPINFO * lpbiInput, BITMAPINFO * lpbiOutput)  LRESULT compress_begin(CODEC * codec, BITMAPINFO * lpbiInput, BITMAPINFO * lpbiOutput)
385  {  {
# Line 355  Line 390 
390          xvid_plugin_2pass1_t pass1;          xvid_plugin_2pass1_t pass1;
391          xvid_plugin_2pass2_t pass2;          xvid_plugin_2pass2_t pass2;
392      int i;      int i;
393            HANDLE hFile;
394    
395            CONFIG tmpCfg; /* if we want to alter config to suit our needs, it shouldn't be visible to user later */
396            memcpy(&tmpCfg, &codec->config, sizeof(CONFIG));
397    
398          if (init_dll() != 0) return ICERR_ERROR;          if (init_dll() != 0) return ICERR_ERROR;
399      /* destroy previously created codec */      /* destroy previously created codec */
# Line 372  Line 411 
411          memset(&create, 0, sizeof(create));          memset(&create, 0, sizeof(create));
412          create.version = XVID_VERSION;          create.version = XVID_VERSION;
413    
     /* zones */  
     create.zones = malloc(sizeof(xvid_enc_zone_t) * codec->config.num_zones);  
     create.num_zones = codec->config.num_zones;  
     for (i=0; i < create.num_zones; i++) {  
         create.zones[i].frame = codec->config.zones[i].frame;  
         if (codec->config.zones[i].mode == RC_ZONE_QUANT) {  
             create.zones[i].mode = XVID_ZONE_QUANT;  
             create.zones[i].increment = codec->config.zones[i].quant;  
         }else{  
             create.zones[i].mode = XVID_ZONE_WEIGHT;  
             create.zones[i].increment = codec->config.zones[i].weight;  
         }  
         create.zones[i].base = 100;  
     }  
   
414      /* plugins */      /* plugins */
415          create.plugins = plugins;          create.plugins = plugins;
416          switch (codec->config.mode)          switch (codec->config.mode)
# Line 401  Line 425 
425          plugins[create.num_plugins].func = xvid_plugin_single_func;          plugins[create.num_plugins].func = xvid_plugin_single_func;
426          plugins[create.num_plugins].param = &single;          plugins[create.num_plugins].param = &single;
427          create.num_plugins++;          create.num_plugins++;
428                    if (!codec->config.use_2pass_bitrate) /* constant-quant mode */
429                            prepare_cquant_zones(&tmpCfg);
430          break;          break;
431    
432          case RC_MODE_2PASS1 :          case RC_MODE_2PASS1 :
# Line 423  Line 449 
449          }          }
450                  pass2.filename = codec->config.stats;                  pass2.filename = codec->config.stats;
451    
452                    hFile = CreateFile(pass2.filename, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
453                    if (hFile == INVALID_HANDLE_VALUE)
454                    {
455                            MessageBox(0, "Statsfile not found!","Error!", MB_ICONEXCLAMATION|MB_OK);
456                            return XVID_ERR_FAIL;
457                    } else
458                    {
459                            CloseHandle(hFile);
460                    }
461    
462          pass2.keyframe_boost = codec->config.keyframe_boost;   /* keyframe boost percentage: [0..100...]; */          pass2.keyframe_boost = codec->config.keyframe_boost;   /* keyframe boost percentage: [0..100...]; */
463          pass2.curve_compression_high = codec->config.curve_compression_high;          pass2.curve_compression_high = codec->config.curve_compression_high;
464          pass2.curve_compression_low = codec->config.curve_compression_low;          pass2.curve_compression_low = codec->config.curve_compression_low;
# Line 445  Line 481 
481                  break;                  break;
482          }          }
483    
484            /* zones  - copy from tmpCfg in case we automatically altered them above */
485            create.zones = malloc(sizeof(xvid_enc_zone_t) * tmpCfg.num_zones);
486            create.num_zones = tmpCfg.num_zones;
487            for (i=0; i < create.num_zones; i++) {
488                    create.zones[i].frame = tmpCfg.zones[i].frame;
489                    if (tmpCfg.zones[i].mode == RC_ZONE_QUANT) {
490                            create.zones[i].mode = XVID_ZONE_QUANT;
491                            create.zones[i].increment = tmpCfg.zones[i].quant;
492                    }else{
493                            create.zones[i].mode = XVID_ZONE_WEIGHT;
494                            create.zones[i].increment = tmpCfg.zones[i].weight;
495                    }
496                    create.zones[i].base = 100;
497            }
498    
499            /* lumimasking plugin */
500          if ((profiles[codec->config.profile].flags & PROFILE_ADAPTQUANT) && codec->config.lum_masking) {          if ((profiles[codec->config.profile].flags & PROFILE_ADAPTQUANT) && codec->config.lum_masking) {
501          plugins[create.num_plugins].func = xvid_plugin_lumimasking_func;          plugins[create.num_plugins].func = xvid_plugin_lumimasking_func;
502          plugins[create.num_plugins].param = NULL;          plugins[create.num_plugins].param = NULL;
# Line 848  Line 900 
900          return ICERR_OK;          return ICERR_OK;
901  }  }
902    
903    #define REG_GET_N(X, Y, Z) \
904    { \
905            DWORD size = sizeof(int); \
906            if (RegQueryValueEx(hKey, X, 0, 0, (LPBYTE)&Y, &size) != ERROR_SUCCESS) { \
907                    Y=Z; \
908            } \
909    }while(0)
910    
911  LRESULT decompress_begin(CODEC * codec, BITMAPINFO * lpbiInput, BITMAPINFO * lpbiOutput)  LRESULT decompress_begin(CODEC * codec, BITMAPINFO * lpbiInput, BITMAPINFO * lpbiOutput)
912  {  {
913          xvid_gbl_init_t init;          xvid_gbl_init_t init;
914          xvid_dec_create_t create;          xvid_dec_create_t create;
915            HKEY hKey;
916    
917          if (init_dll() != 0) return ICERR_ERROR;          if (init_dll() != 0) return ICERR_ERROR;
918    
# Line 883  Line 943 
943    
944          codec->dhandle = create.handle;          codec->dhandle = create.handle;
945    
946            RegOpenKeyEx(XVID_REG_KEY, XVID_REG_PARENT "\\" XVID_REG_CHILD, 0, KEY_READ, &hKey);
947    
948            REG_GET_N("Deblock_Y",  pp_dy, 0)
949            REG_GET_N("Deblock_UV", pp_duv, 0)
950            REG_GET_N("Dering",  pp_dr, 0)
951            REG_GET_N("FilmEffect", pp_fe, 0)
952    
953            RegCloseKey(hKey);
954    
955          return ICERR_OK;          return ICERR_OK;
956  }  }
957    
# Line 973  Line 1042 
1042                  frame.output.csp = XVID_CSP_NULL;                  frame.output.csp = XVID_CSP_NULL;
1043          }          }
1044    
1045            if (pp_dy)frame.general |= XVID_DEBLOCKY;
1046            if (pp_duv) frame.general |= XVID_DEBLOCKUV;
1047    /*      if (pp_dr) frame.general |= XVID_DERING; */
1048            if (pp_fe) frame.general |= XVID_FILMEFFECT;
1049    
1050          switch (xvid_decore_func(codec->dhandle, XVID_DEC_DECODE, &frame, NULL))          switch (xvid_decore_func(codec->dhandle, XVID_DEC_DECODE, &frame, NULL))
1051          {          {
1052          case XVID_ERR_FAIL :          case XVID_ERR_FAIL :

Legend:
Removed from v.1305  
changed lines
  Added in v.1329

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