@@ -71,6 +71,9 @@ typedef struct TestSourceContext {
71
71
/* only used by testsrc2 */
72
72
int alpha ;
73
73
74
+ /* only used by yuvtest */
75
+ uint8_t ayuv_map [4 ];
76
+
74
77
/* only used by colorspectrum */
75
78
int type ;
76
79
@@ -1141,125 +1144,64 @@ const AVFilter ff_vsrc_rgbtestsrc = {
1141
1144
1142
1145
#if CONFIG_YUVTESTSRC_FILTER
1143
1146
1144
- static void yuvtest_fill_picture8 (AVFilterContext * ctx , AVFrame * frame )
1145
- {
1146
- int x , y , w = frame -> width , h = frame -> height / 3 ;
1147
- const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get (frame -> format );
1148
- const int factor = 1 << desc -> comp [0 ].depth ;
1149
- const int mid = 1 << (desc -> comp [0 ].depth - 1 );
1150
- uint8_t * ydst = frame -> data [0 ];
1151
- uint8_t * udst = frame -> data [1 ];
1152
- uint8_t * vdst = frame -> data [2 ];
1153
- ptrdiff_t ylinesize = frame -> linesize [0 ];
1154
- ptrdiff_t ulinesize = frame -> linesize [1 ];
1155
- ptrdiff_t vlinesize = frame -> linesize [2 ];
1156
-
1157
- for (y = 0 ; y < h ; y ++ ) {
1158
- for (x = 0 ; x < w ; x ++ ) {
1159
- int c = factor * x / w ;
1160
-
1161
- ydst [x ] = c ;
1162
- udst [x ] = mid ;
1163
- vdst [x ] = mid ;
1164
- }
1165
-
1166
- ydst += ylinesize ;
1167
- udst += ulinesize ;
1168
- vdst += vlinesize ;
1169
- }
1170
-
1171
- h += h ;
1172
- for (; y < h ; y ++ ) {
1173
- for (x = 0 ; x < w ; x ++ ) {
1174
- int c = factor * x / w ;
1175
-
1176
- ydst [x ] = mid ;
1177
- udst [x ] = c ;
1178
- vdst [x ] = mid ;
1179
- }
1180
-
1181
- ydst += ylinesize ;
1182
- udst += ulinesize ;
1183
- vdst += vlinesize ;
1184
- }
1185
-
1186
- for (; y < frame -> height ; y ++ ) {
1187
- for (x = 0 ; x < w ; x ++ ) {
1188
- int c = factor * x / w ;
1147
+ #define Y 0
1148
+ #define U 1
1149
+ #define V 2
1189
1150
1190
- ydst [x ] = mid ;
1191
- udst [x ] = mid ;
1192
- vdst [x ] = c ;
1193
- }
1151
+ static void yuvtest_put_pixel (uint8_t * dstp [4 ], int dst_linesizep [4 ],
1152
+ int i , int j , unsigned y , unsigned u , unsigned v , enum AVPixelFormat fmt ,
1153
+ uint8_t ayuv_map [4 ])
1154
+ {
1155
+ uint32_t n ;
1194
1156
1195
- ydst += ylinesize ;
1196
- udst += ulinesize ;
1197
- vdst += vlinesize ;
1157
+ switch (fmt ) {
1158
+ case AV_PIX_FMT_YUV444P :
1159
+ case AV_PIX_FMT_YUVJ444P :
1160
+ dstp [0 ][i + j * dst_linesizep [0 ]] = y ;
1161
+ dstp [1 ][i + j * dst_linesizep [1 ]] = u ;
1162
+ dstp [2 ][i + j * dst_linesizep [2 ]] = v ;
1163
+ break ;
1164
+ case AV_PIX_FMT_YUV444P9 :
1165
+ case AV_PIX_FMT_YUV444P10 :
1166
+ case AV_PIX_FMT_YUV444P12 :
1167
+ case AV_PIX_FMT_YUV444P14 :
1168
+ case AV_PIX_FMT_YUV444P16 :
1169
+ AV_WN16 (& dstp [0 ][i * 2 + j * dst_linesizep [0 ]], y );
1170
+ AV_WN16 (& dstp [1 ][i * 2 + j * dst_linesizep [1 ]], u );
1171
+ AV_WN16 (& dstp [2 ][i * 2 + j * dst_linesizep [2 ]], v );
1172
+ break ;
1198
1173
}
1199
1174
}
1200
1175
1201
- static void yuvtest_fill_picture16 (AVFilterContext * ctx , AVFrame * frame )
1176
+ static void yuvtest_fill_picture (AVFilterContext * ctx , AVFrame * frame )
1202
1177
{
1203
- int x , y , w = frame -> width , h = frame -> height / 3 ;
1178
+ TestSourceContext * test = ctx -> priv ;
1179
+ int i , j , w = frame -> width , h = frame -> height ;
1204
1180
const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get (frame -> format );
1205
1181
const int factor = 1 << desc -> comp [0 ].depth ;
1206
1182
const int mid = 1 << (desc -> comp [0 ].depth - 1 );
1207
- uint16_t * ydst = (uint16_t * )frame -> data [0 ];
1208
- uint16_t * udst = (uint16_t * )frame -> data [1 ];
1209
- uint16_t * vdst = (uint16_t * )frame -> data [2 ];
1210
- ptrdiff_t ylinesize = frame -> linesize [0 ] / 2 ;
1211
- ptrdiff_t ulinesize = frame -> linesize [1 ] / 2 ;
1212
- ptrdiff_t vlinesize = frame -> linesize [2 ] / 2 ;
1213
-
1214
- for (y = 0 ; y < h ; y ++ ) {
1215
- for (x = 0 ; x < w ; x ++ ) {
1216
- int c = factor * x / w ;
1217
1183
1218
- ydst [x ] = c ;
1219
- udst [x ] = mid ;
1220
- vdst [x ] = mid ;
1221
- }
1222
-
1223
- ydst += ylinesize ;
1224
- udst += ulinesize ;
1225
- vdst += vlinesize ;
1226
- }
1184
+ for (j = 0 ; j < h ; j ++ ) {
1185
+ for (i = 0 ; i < w ; i ++ ) {
1186
+ int c = factor * i / w ;
1187
+ int y = mid , u = mid , v = mid ;
1227
1188
1228
- h += h ;
1229
- for (; y < h ; y ++ ) {
1230
- for (x = 0 ; x < w ; x ++ ) {
1231
- int c = factor * x / w ;
1232
-
1233
- ydst [x ] = mid ;
1234
- udst [x ] = c ;
1235
- vdst [x ] = mid ;
1236
- }
1189
+ if (3 * j < h ) y = c ;
1190
+ else if (3 * j < 2 * h ) u = c ;
1191
+ else v = c ;
1237
1192
1238
- ydst += ylinesize ;
1239
- udst += ulinesize ;
1240
- vdst += vlinesize ;
1241
- }
1242
-
1243
- for (; y < frame -> height ; y ++ ) {
1244
- for (x = 0 ; x < w ; x ++ ) {
1245
- int c = factor * x / w ;
1246
-
1247
- ydst [x ] = mid ;
1248
- udst [x ] = mid ;
1249
- vdst [x ] = c ;
1250
- }
1251
-
1252
- ydst += ylinesize ;
1253
- udst += ulinesize ;
1254
- vdst += vlinesize ;
1255
- }
1193
+ yuvtest_put_pixel (frame -> data , frame -> linesize , i , j , y , u , v ,
1194
+ ctx -> outputs [0 ]-> format , test -> ayuv_map );
1195
+ }
1196
+ }
1256
1197
}
1257
1198
1258
1199
static av_cold int yuvtest_init (AVFilterContext * ctx )
1259
1200
{
1260
1201
TestSourceContext * test = ctx -> priv ;
1261
1202
1262
1203
test -> draw_once = 1 ;
1204
+ test -> fill_picture_fn = yuvtest_fill_picture ;
1263
1205
return init (ctx );
1264
1206
}
1265
1207
@@ -1274,9 +1216,8 @@ static const enum AVPixelFormat yuvtest_pix_fmts[] = {
1274
1216
static int yuvtest_config_props (AVFilterLink * outlink )
1275
1217
{
1276
1218
TestSourceContext * test = outlink -> src -> priv ;
1277
- const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get (outlink -> format );
1278
1219
1279
- test -> fill_picture_fn = desc -> comp [ 0 ]. depth > 8 ? yuvtest_fill_picture16 : yuvtest_fill_picture8 ;
1220
+ ff_fill_ayuv_map ( test -> ayuv_map , outlink -> format ) ;
1280
1221
return config_props (outlink );
1281
1222
}
1282
1223
0 commit comments