FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/roqvideo.c
Date: 2026-01-16 07:34:38
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 1771953 static inline void block_copy(unsigned char *out, unsigned char *in,
32 int outstride, int instride, int sz)
33 {
34 1771953 int rows = sz;
35
2/2
✓ Branch 0 taken 7244748 times.
✓ Branch 1 taken 1771953 times.
9016701 while(rows--) {
36 7244748 memcpy(out, in, sz);
37 7244748 out += outstride;
38 7244748 in += instride;
39 }
40 1771953 }
41
42 2212272 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 2212272 stride = ri->current_frame->linesize[0];
48 2212272 boffs = y*stride + x;
49
50 2212272 bptr = ri->current_frame->data[0] + boffs;
51 2212272 bptr[0 ] = cell->y[0];
52 2212272 bptr[1 ] = cell->y[1];
53 2212272 bptr[stride ] = cell->y[2];
54 2212272 bptr[stride+1] = cell->y[3];
55
56 2212272 stride = ri->current_frame->linesize[1];
57 2212272 boffs = y*stride + x;
58
59 2212272 bptr = ri->current_frame->data[1] + boffs;
60 2212272 bptr[0 ] =
61 2212272 bptr[1 ] =
62 2212272 bptr[stride ] =
63 2212272 bptr[stride+1] = cell->u;
64
65 2212272 bptr = ri->current_frame->data[2] + boffs;
66 2212272 bptr[0 ] =
67 2212272 bptr[1 ] =
68 2212272 bptr[stride ] =
69 2212272 bptr[stride+1] = cell->v;
70 2212272 }
71
72 38752 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 38752 stride = ri->current_frame->linesize[0];
78 38752 boffs = y*stride + x;
79
80 38752 bptr = ri->current_frame->data[0] + boffs;
81 38752 bptr[ 0] = bptr[ 1] = bptr[stride ] = bptr[stride +1] = cell->y[0];
82 38752 bptr[ 2] = bptr[ 3] = bptr[stride +2] = bptr[stride +3] = cell->y[1];
83 38752 bptr[stride*2 ] = bptr[stride*2+1] = bptr[stride*3 ] = bptr[stride*3+1] = cell->y[2];
84 38752 bptr[stride*2+2] = bptr[stride*2+3] = bptr[stride*3+2] = bptr[stride*3+3] = cell->y[3];
85
86 38752 stride = ri->current_frame->linesize[1];
87 38752 boffs = y*stride + x;
88
89 38752 bptr = ri->current_frame->data[1] + boffs;
90 38752 bptr[ 0] = bptr[ 1] = bptr[stride ] = bptr[stride +1] =
91 38752 bptr[ 2] = bptr[ 3] = bptr[stride +2] = bptr[stride +3] =
92 38752 bptr[stride*2 ] = bptr[stride*2+1] = bptr[stride*3 ] = bptr[stride*3+1] =
93 38752 bptr[stride*2+2] = bptr[stride*2+3] = bptr[stride*3+2] = bptr[stride*3+3] = cell->u;
94
95 38752 bptr = ri->current_frame->data[2] + boffs;
96 38752 bptr[ 0] = bptr[ 1] = bptr[stride ] = bptr[stride +1] =
97 38752 bptr[ 2] = bptr[ 3] = bptr[stride +2] = bptr[stride +3] =
98 38752 bptr[stride*2 ] = bptr[stride*2+1] = bptr[stride*3 ] = bptr[stride*3+1] =
99 38752 bptr[stride*2+2] = bptr[stride*2+3] = bptr[stride*3+2] = bptr[stride*3+3] = cell->v;
100 38752 }
101
102
103 590651 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 590651 mx = x + deltax;
109 590651 my = y + deltay;
110
111 /* check MV against frame boundaries */
112
3/6
✓ Branch 0 taken 590651 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 590651 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 590651 times.
✗ Branch 5 not taken.
590651 if ((mx < 0) || (mx > ri->width - sz) ||
113
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 590651 times.
590651 (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 590651 times.
590651 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 1771953 times.
✓ Branch 1 taken 590651 times.
2362604 for(cp = 0; cp < 3; cp++) {
125 1771953 int outstride = ri->current_frame->linesize[cp];
126 1771953 int instride = ri->last_frame ->linesize[cp];
127 1771953 block_copy(ri->current_frame->data[cp] + y*outstride + x,
128 1771953 ri->last_frame->data[cp] + my*instride + mx,
129 outstride, instride, sz);
130 }
131 }
132
133
134 577573 void ff_apply_motion_4x4(RoqContext *ri, int x, int y,
135 int deltax, int deltay)
136 {
137 577573 apply_motion_generic(ri, x, y, deltax, deltay, 4);
138 577573 }
139
140 13078 void ff_apply_motion_8x8(RoqContext *ri, int x, int y,
141 int deltax, int deltay)
142 {
143 13078 apply_motion_generic(ri, x, y, deltax, deltay, 8);
144 13078 }
145