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