FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/roqvideo.c
Date: 2021-09-24 20:55:06
Exec Total Coverage
Lines: 66 70 94.3%
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 1771605 static inline void block_copy(unsigned char *out, unsigned char *in,
32 int outstride, int instride, int sz)
33 {
34 1771605 int rows = sz;
35
2/2
✓ Branch 0 taken 7243128 times.
✓ Branch 1 taken 1771605 times.
9014733 while(rows--) {
36 7243128 memcpy(out, in, sz);
37 7243128 out += outstride;
38 7243128 in += instride;
39 }
40 1771605 }
41
42 2213788 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 2213788 stride = ri->current_frame->linesize[0];
48 2213788 boffs = y*stride + x;
49
50 2213788 bptr = ri->current_frame->data[0] + boffs;
51 2213788 bptr[0 ] = cell->y[0];
52 2213788 bptr[1 ] = cell->y[1];
53 2213788 bptr[stride ] = cell->y[2];
54 2213788 bptr[stride+1] = cell->y[3];
55
56 2213788 stride = ri->current_frame->linesize[1];
57 2213788 boffs = y*stride + x;
58
59 2213788 bptr = ri->current_frame->data[1] + boffs;
60 2213788 bptr[0 ] =
61 2213788 bptr[1 ] =
62 2213788 bptr[stride ] =
63 2213788 bptr[stride+1] = cell->u;
64
65 2213788 bptr = ri->current_frame->data[2] + boffs;
66 2213788 bptr[0 ] =
67 2213788 bptr[1 ] =
68 2213788 bptr[stride ] =
69 2213788 bptr[stride+1] = cell->v;
70 2213788 }
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 590535 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 590535 mx = x + deltax;
109 590535 my = y + deltay;
110
111 /* check MV against frame boundaries */
112
3/6
✓ Branch 0 taken 590535 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 590535 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 590535 times.
✗ Branch 5 not taken.
590535 if ((mx < 0) || (mx > ri->width - sz) ||
113
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 590535 times.
590535 (my < 0) || (my > ri->height - sz)) {
114 av_log(ri->avctx, 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 590535 times.
590535 if (!ri->last_frame->data[0]) {
120 av_log(ri->avctx, AV_LOG_ERROR, "Invalid decode type. Invalid header?\n");
121 return;
122 }
123
124
2/2
✓ Branch 0 taken 1771605 times.
✓ Branch 1 taken 590535 times.
2362140 for(cp = 0; cp < 3; cp++) {
125 1771605 int outstride = ri->current_frame->linesize[cp];
126 1771605 int instride = ri->last_frame ->linesize[cp];
127 1771605 block_copy(ri->current_frame->data[cp] + y*outstride + x,
128 1771605 ri->last_frame->data[cp] + my*instride + mx,
129 outstride, instride, sz);
130 }
131 }
132
133
134 577476 void ff_apply_motion_4x4(RoqContext *ri, int x, int y,
135 int deltax, int deltay)
136 {
137 577476 apply_motion_generic(ri, x, y, deltax, deltay, 4);
138 577476 }
139
140 13059 void ff_apply_motion_8x8(RoqContext *ri, int x, int y,
141 int deltax, int deltay)
142 {
143 13059 apply_motion_generic(ri, x, y, deltax, deltay, 8);
144 13059 }
145