FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/roqvideo.c
Date: 2024-04-18 20:30:25
Exec Total Coverage
Lines: 66 70 94.3%
Functions: 6 6 100.0%
Branches: 9 14 64.3%

Line Branch Exec Source
1 /*
2 * Copyright (C) 2003 Mike Melanson
3 * Copyright (C) 2003 Dr. Tim Ferguson
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 * @file
24 * id RoQ Video common functions based on work by Dr. Tim Ferguson
25 */
26
27 #include <stdint.h>
28 #include <string.h>
29 #include "roqvideo.h"
30
31 1771260 static inline void block_copy(unsigned char *out, unsigned char *in,
32 int outstride, int instride, int sz)
33 {
34 1771260 int rows = sz;
35
2/2
✓ Branch 0 taken 7241736 times.
✓ Branch 1 taken 1771260 times.
9012996 while(rows--) {
36 7241736 memcpy(out, in, sz);
37 7241736 out += outstride;
38 7241736 in += instride;
39 }
40 1771260 }
41
42 2214272 void ff_apply_vector_2x2(RoqContext *ri, int x, int y, roq_cell *cell)
43 {
44 unsigned char *bptr;
45 int boffs,stride;
46
47 2214272 stride = ri->current_frame->linesize[0];
48 2214272 boffs = y*stride + x;
49
50 2214272 bptr = ri->current_frame->data[0] + boffs;
51 2214272 bptr[0 ] = cell->y[0];
52 2214272 bptr[1 ] = cell->y[1];
53 2214272 bptr[stride ] = cell->y[2];
54 2214272 bptr[stride+1] = cell->y[3];
55
56 2214272 stride = ri->current_frame->linesize[1];
57 2214272 boffs = y*stride + x;
58
59 2214272 bptr = ri->current_frame->data[1] + boffs;
60 2214272 bptr[0 ] =
61 2214272 bptr[1 ] =
62 2214272 bptr[stride ] =
63 2214272 bptr[stride+1] = cell->u;
64
65 2214272 bptr = ri->current_frame->data[2] + boffs;
66 2214272 bptr[0 ] =
67 2214272 bptr[1 ] =
68 2214272 bptr[stride ] =
69 2214272 bptr[stride+1] = cell->v;
70 2214272 }
71
72 38568 void ff_apply_vector_4x4(RoqContext *ri, int x, int y, roq_cell *cell)
73 {
74 unsigned char *bptr;
75 int boffs,stride;
76
77 38568 stride = ri->current_frame->linesize[0];
78 38568 boffs = y*stride + x;
79
80 38568 bptr = ri->current_frame->data[0] + boffs;
81 38568 bptr[ 0] = bptr[ 1] = bptr[stride ] = bptr[stride +1] = cell->y[0];
82 38568 bptr[ 2] = bptr[ 3] = bptr[stride +2] = bptr[stride +3] = cell->y[1];
83 38568 bptr[stride*2 ] = bptr[stride*2+1] = bptr[stride*3 ] = bptr[stride*3+1] = cell->y[2];
84 38568 bptr[stride*2+2] = bptr[stride*2+3] = bptr[stride*3+2] = bptr[stride*3+3] = cell->y[3];
85
86 38568 stride = ri->current_frame->linesize[1];
87 38568 boffs = y*stride + x;
88
89 38568 bptr = ri->current_frame->data[1] + boffs;
90 38568 bptr[ 0] = bptr[ 1] = bptr[stride ] = bptr[stride +1] =
91 38568 bptr[ 2] = bptr[ 3] = bptr[stride +2] = bptr[stride +3] =
92 38568 bptr[stride*2 ] = bptr[stride*2+1] = bptr[stride*3 ] = bptr[stride*3+1] =
93 38568 bptr[stride*2+2] = bptr[stride*2+3] = bptr[stride*3+2] = bptr[stride*3+3] = cell->u;
94
95 38568 bptr = ri->current_frame->data[2] + boffs;
96 38568 bptr[ 0] = bptr[ 1] = bptr[stride ] = bptr[stride +1] =
97 38568 bptr[ 2] = bptr[ 3] = bptr[stride +2] = bptr[stride +3] =
98 38568 bptr[stride*2 ] = bptr[stride*2+1] = bptr[stride*3 ] = bptr[stride*3+1] =
99 38568 bptr[stride*2+2] = bptr[stride*2+3] = bptr[stride*3+2] = bptr[stride*3+3] = cell->v;
100 38568 }
101
102
103 590420 static inline void apply_motion_generic(RoqContext *ri, int x, int y, int deltax,
104 int deltay, int sz)
105 {
106 int mx, my, cp;
107
108 590420 mx = x + deltax;
109 590420 my = y + deltay;
110
111 /* check MV against frame boundaries */
112
3/6
✓ Branch 0 taken 590420 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 590420 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 590420 times.
✗ Branch 5 not taken.
590420 if ((mx < 0) || (mx > ri->width - sz) ||
113
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 590420 times.
590420 (my < 0) || (my > ri->height - sz)) {
114 av_log(ri->logctx, AV_LOG_ERROR, "motion vector out of bounds: MV = (%d, %d), boundaries = (0, 0, %d, %d)\n",
115 mx, my, ri->width, ri->height);
116 return;
117 }
118
119
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 590420 times.
590420 if (!ri->last_frame->data[0]) {
120 av_log(ri->logctx, AV_LOG_ERROR, "Invalid decode type. Invalid header?\n");
121 return;
122 }
123
124
2/2
✓ Branch 0 taken 1771260 times.
✓ Branch 1 taken 590420 times.
2361680 for(cp = 0; cp < 3; cp++) {
125 1771260 int outstride = ri->current_frame->linesize[cp];
126 1771260 int instride = ri->last_frame ->linesize[cp];
127 1771260 block_copy(ri->current_frame->data[cp] + y*outstride + x,
128 1771260 ri->last_frame->data[cp] + my*instride + mx,
129 outstride, instride, sz);
130 }
131 }
132
133
134 577362 void ff_apply_motion_4x4(RoqContext *ri, int x, int y,
135 int deltax, int deltay)
136 {
137 577362 apply_motion_generic(ri, x, y, deltax, deltay, 4);
138 577362 }
139
140 13058 void ff_apply_motion_8x8(RoqContext *ri, int x, int y,
141 int deltax, int deltay)
142 {
143 13058 apply_motion_generic(ri, x, y, deltax, deltay, 8);
144 13058 }
145