yading@10
|
1 /*
|
yading@10
|
2 * MQ-coder encoder
|
yading@10
|
3 * Copyright (c) 2007 Kamil Nowosad
|
yading@10
|
4 *
|
yading@10
|
5 * This file is part of FFmpeg.
|
yading@10
|
6 *
|
yading@10
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
9 * License as published by the Free Software Foundation; either
|
yading@10
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
11 *
|
yading@10
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
15 * Lesser General Public License for more details.
|
yading@10
|
16 *
|
yading@10
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
20 */
|
yading@10
|
21
|
yading@10
|
22 /**
|
yading@10
|
23 * MQ-coder encoder
|
yading@10
|
24 * @file
|
yading@10
|
25 * @author Kamil Nowosad
|
yading@10
|
26 */
|
yading@10
|
27
|
yading@10
|
28 #include "mqc.h"
|
yading@10
|
29
|
yading@10
|
30 static void byteout(MqcState *mqc)
|
yading@10
|
31 {
|
yading@10
|
32 retry:
|
yading@10
|
33 if (*mqc->bp == 0xff){
|
yading@10
|
34 mqc->bp++;
|
yading@10
|
35 *mqc->bp = mqc->c >> 20;
|
yading@10
|
36 mqc->c &= 0xfffff;
|
yading@10
|
37 mqc->ct = 7;
|
yading@10
|
38 } else if ((mqc->c & 0x8000000)){
|
yading@10
|
39 (*mqc->bp)++;
|
yading@10
|
40 mqc->c &= 0x7ffffff;
|
yading@10
|
41 goto retry;
|
yading@10
|
42 } else{
|
yading@10
|
43 mqc->bp++;
|
yading@10
|
44 *mqc->bp = mqc->c >> 19;
|
yading@10
|
45 mqc->c &= 0x7ffff;
|
yading@10
|
46 mqc->ct = 8;
|
yading@10
|
47 }
|
yading@10
|
48 }
|
yading@10
|
49
|
yading@10
|
50 static void renorme(MqcState *mqc)
|
yading@10
|
51 {
|
yading@10
|
52 do{
|
yading@10
|
53 mqc->a += mqc->a;
|
yading@10
|
54 mqc->c += mqc->c;
|
yading@10
|
55 if (!--mqc->ct)
|
yading@10
|
56 byteout(mqc);
|
yading@10
|
57 } while (!(mqc->a & 0x8000));
|
yading@10
|
58 }
|
yading@10
|
59
|
yading@10
|
60 static void setbits(MqcState *mqc)
|
yading@10
|
61 {
|
yading@10
|
62 int tmp = mqc->c + mqc->a;
|
yading@10
|
63 mqc->c |= 0xffff;
|
yading@10
|
64 if (mqc->c >= tmp)
|
yading@10
|
65 mqc->c -= 0x8000;
|
yading@10
|
66 }
|
yading@10
|
67
|
yading@10
|
68 void ff_mqc_initenc(MqcState *mqc, uint8_t *bp)
|
yading@10
|
69 {
|
yading@10
|
70 ff_mqc_init_contexts(mqc);
|
yading@10
|
71 mqc->a = 0x8000;
|
yading@10
|
72 mqc->c = 0;
|
yading@10
|
73 mqc->bp = bp-1;
|
yading@10
|
74 mqc->bpstart = bp;
|
yading@10
|
75 mqc->ct = 12 + (*mqc->bp == 0xff);
|
yading@10
|
76 }
|
yading@10
|
77
|
yading@10
|
78 void ff_mqc_encode(MqcState *mqc, uint8_t *cxstate, int d)
|
yading@10
|
79 {
|
yading@10
|
80 int qe;
|
yading@10
|
81
|
yading@10
|
82 qe = ff_mqc_qe[*cxstate];
|
yading@10
|
83 mqc->a -= qe;
|
yading@10
|
84 if ((*cxstate & 1) == d){
|
yading@10
|
85 if (!(mqc->a & 0x8000)){
|
yading@10
|
86 if (mqc->a < qe)
|
yading@10
|
87 mqc->a = qe;
|
yading@10
|
88 else
|
yading@10
|
89 mqc->c += qe;
|
yading@10
|
90 *cxstate = ff_mqc_nmps[*cxstate];
|
yading@10
|
91 renorme(mqc);
|
yading@10
|
92 } else
|
yading@10
|
93 mqc->c += qe;
|
yading@10
|
94 } else{
|
yading@10
|
95 if (mqc->a < qe)
|
yading@10
|
96 mqc->c += qe;
|
yading@10
|
97 else
|
yading@10
|
98 mqc->a = qe;
|
yading@10
|
99 *cxstate = ff_mqc_nlps[*cxstate];
|
yading@10
|
100 renorme(mqc);
|
yading@10
|
101 }
|
yading@10
|
102 }
|
yading@10
|
103
|
yading@10
|
104 int ff_mqc_length(MqcState *mqc)
|
yading@10
|
105 {
|
yading@10
|
106 return mqc->bp - mqc->bpstart;
|
yading@10
|
107 }
|
yading@10
|
108
|
yading@10
|
109 int ff_mqc_flush(MqcState *mqc)
|
yading@10
|
110 {
|
yading@10
|
111 setbits(mqc);
|
yading@10
|
112 mqc->c = mqc->c << mqc->ct;
|
yading@10
|
113 byteout(mqc);
|
yading@10
|
114 mqc->c = mqc->c << mqc->ct;
|
yading@10
|
115 byteout(mqc);
|
yading@10
|
116 if (*mqc->bp != 0xff)
|
yading@10
|
117 mqc->bp++;
|
yading@10
|
118 return mqc->bp - mqc->bpstart;
|
yading@10
|
119 }
|