[cvs] / xvidcore / src / plugins / plugin_2pass1.c Repository:
ViewVC logotype

Diff of /xvidcore/src/plugins/plugin_2pass1.c

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

revision 1.1, Sun Mar 23 04:03:01 2003 UTC revision 1.1.2.11, Thu Dec 18 17:43:32 2003 UTC
# Line 0  Line 1 
1    /******************************************************************************
2     *
3     *  XviD Bit Rate Controller Library
4     *  - VBR 2 pass bitrate controler implementation -
5     *
6     *  Copyright (C) 2002-2003 Edouard Gomez <ed.gomez@free.fr>
7     *
8     *  The curve treatment algorithm is the one implemented by Foxer <email?> and
9     *  Dirk Knop <dknop@gwdg.de> for the XviD vfw dynamic library.
10     *
11     *  This program is free software; you can redistribute it and/or modify
12     *  it under the terms of the GNU General Public License as published by
13     *  the Free Software Foundation; either version 2 of the License, or
14     *  (at your option) any later version.
15     *
16     *  This program is distributed in the hope that it will be useful,
17     *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18     *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19     *  GNU General Public License for more details.
20     *
21     *  You should have received a copy of the GNU General Public License
22     *  along with this program; if not, write to the Free Software
23     *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24     *
25     * $Id$
26     *
27     *****************************************************************************/
28    
29    #include <stdio.h>
30    
31    #include "../xvid.h"
32    #include "../image/image.h"
33    
34    
35    /* context struct */
36    typedef struct
37    {
38            FILE * stat_file;
39    
40        double fq_error;
41    } rc_2pass1_t;
42    
43    
44    
45    static int rc_2pass1_create(xvid_plg_create_t * create, rc_2pass1_t ** handle)
46    {
47        xvid_plugin_2pass1_t * param = (xvid_plugin_2pass1_t *)create->param;
48            rc_2pass1_t * rc;
49    
50        /* check filename */
51        if ((param->filename == NULL) ||
52                    (param->filename != NULL && param->filename[0] == '\0'))
53            return XVID_ERR_FAIL;
54    
55        /* allocate context struct */
56            if((rc = malloc(sizeof(rc_2pass1_t))) == NULL)
57                    return(XVID_ERR_MEMORY);
58    
59        /* Initialize safe defaults for 2pass 1 */
60        rc->stat_file = NULL;
61    
62            /* Open the 1st pass file */
63            if((rc->stat_file = fopen(param->filename, "w+b")) == NULL)
64                    return(XVID_ERR_FAIL);
65    
66            /*
67             * The File Header
68             */
69            fprintf(rc->stat_file, "# XviD 2pass stat file (core version %d.%d.%d)\n",
70                            XVID_VERSION_MAJOR(XVID_VERSION),
71                            XVID_VERSION_MINOR(XVID_VERSION),
72                            XVID_VERSION_PATCH(XVID_VERSION));
73            fprintf(rc->stat_file, "# Please do not modify this file\n\n");
74    
75        rc->fq_error = 0;
76    
77        *handle = rc;
78            return(0);
79    }
80    
81    
82    static int rc_2pass1_destroy(rc_2pass1_t * rc, xvid_plg_destroy_t * destroy)
83    {
84            fclose(rc->stat_file);
85            free(rc);
86            return(0);
87    }
88    
89    
90    static int rc_2pass1_before(rc_2pass1_t * rc, xvid_plg_data_t * data)
91    {
92             if (data->quant <= 0) {
93                    if (data->zone && data->zone->mode == XVID_ZONE_QUANT) {
94                            rc->fq_error += (double)data->zone->increment / (double)data->zone->base;
95                            data->quant = (int)rc->fq_error;
96                            rc->fq_error -= data->quant;
97                    } else {
98                            data->quant = 2;
99                    }
100            }
101             return(0);
102    }
103    
104    
105    static int rc_2pass1_after(rc_2pass1_t * rc, xvid_plg_data_t * data)
106    {
107            char type;
108            xvid_enc_stats_t *stats = &data->stats;
109    
110            /* Frame type in ascii I/P/B */
111            switch(stats->type) {
112            case XVID_TYPE_IVOP:
113                    type = 'i';
114                    break;
115            case XVID_TYPE_PVOP:
116                    type = 'p';
117                    break;
118            case XVID_TYPE_BVOP:
119                    type = 'b';
120                    break;
121            case XVID_TYPE_SVOP:
122                    type = 's';
123                    break;
124            default: /* Should not go here */
125                    return(XVID_ERR_FAIL);
126            }
127    
128            /* write the resulting statistics */
129    
130            fprintf(rc->stat_file, "%c %d %d %d %d %d %d\n",
131                            type,
132                            stats->quant,
133                            stats->kblks,
134                            stats->mblks,
135                            stats->ublks,
136                            stats->length,
137                            stats->hlength);
138    
139            return(0);
140    }
141    
142    
143    
144    int xvid_plugin_2pass1(void * handle, int opt, void * param1, void * param2)
145    {
146        switch(opt)
147        {
148        case XVID_PLG_INFO :
149            case XVID_PLG_FRAME :
150            return 0;
151    
152        case XVID_PLG_CREATE :
153            return rc_2pass1_create((xvid_plg_create_t*)param1, param2);
154    
155        case XVID_PLG_DESTROY :
156            return rc_2pass1_destroy((rc_2pass1_t*)handle, (xvid_plg_destroy_t*)param1);
157    
158        case XVID_PLG_BEFORE :
159            return rc_2pass1_before((rc_2pass1_t*)handle, (xvid_plg_data_t*)param1);
160    
161        case XVID_PLG_AFTER :
162            return rc_2pass1_after((rc_2pass1_t*)handle, (xvid_plg_data_t*)param1);
163        }
164    
165        return XVID_ERR_FAIL;
166    }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.1.2.11

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