@@ -240,29 +240,29 @@ static void freeBuffer(AppendableBuffer *ab) {
240
240
}
241
241
}
242
242
243
- static Object allocateObject (NVDriver * drv , ObjectType type , int allocatePtrSize ) {
243
+ static Object allocateObject (NVDriver * drv , ObjectType type , size_t allocatePtrSize ) {
244
244
Object newObj = (Object ) calloc (1 , sizeof (struct Object_t ));
245
245
246
246
newObj -> type = type ;
247
- newObj -> id = (++ drv -> nextObjId );
248
247
249
248
if (allocatePtrSize > 0 ) {
250
249
newObj -> obj = calloc (1 , allocatePtrSize );
251
250
}
252
251
253
252
pthread_mutex_lock (& drv -> objectCreationMutex );
253
+ newObj -> id = (++ drv -> nextObjId );
254
254
add_element (& drv -> objects , newObj );
255
255
pthread_mutex_unlock (& drv -> objectCreationMutex );
256
256
257
257
return newObj ;
258
258
}
259
259
260
- static Object getObject (NVDriver * drv , VAGenericID id ) {
260
+ static Object getObject (NVDriver * drv , ObjectType type , VAGenericID id ) {
261
261
Object ret = NULL ;
262
262
if (id != VA_INVALID_ID ) {
263
263
pthread_mutex_lock (& drv -> objectCreationMutex );
264
264
ARRAY_FOR_EACH (Object , o , & drv -> objects )
265
- if (o -> id == id ) {
265
+ if (o -> id == id && o -> type == type ) {
266
266
ret = o ;
267
267
break ;
268
268
}
@@ -272,22 +272,22 @@ static Object getObject(NVDriver *drv, VAGenericID id) {
272
272
return ret ;
273
273
}
274
274
275
- static void * getObjectPtr (NVDriver * drv , VAGenericID id ) {
275
+ static void * getObjectPtr (NVDriver * drv , ObjectType type , VAGenericID id ) {
276
276
if (id != VA_INVALID_ID ) {
277
- Object o = getObject (drv , id );
277
+ Object o = getObject (drv , type , id );
278
278
if (o != NULL ) {
279
279
return o -> obj ;
280
280
}
281
281
}
282
282
return NULL ;
283
283
}
284
284
285
- static Object getObjectByPtr (NVDriver * drv , void * ptr ) {
285
+ static Object getObjectByPtr (NVDriver * drv , ObjectType type , void * ptr ) {
286
286
Object ret = NULL ;
287
287
if (ptr != NULL ) {
288
288
pthread_mutex_lock (& drv -> objectCreationMutex );
289
289
ARRAY_FOR_EACH (Object , o , & drv -> objects )
290
- if (o -> obj == ptr ) {
290
+ if (o -> obj == ptr && o -> type == type ) {
291
291
ret = o ;
292
292
break ;
293
293
}
@@ -351,15 +351,15 @@ static void deleteAllObjects(NVDriver *drv) {
351
351
LOG ("Found object %d or type %d" , o -> id , o -> type );
352
352
if (o -> type == OBJECT_TYPE_CONTEXT ) {
353
353
destroyContext (drv , (NVContext * ) o -> obj );
354
- deleteObject (drv , o -> id );
355
354
}
355
+ deleteObject (drv , o -> id );
356
356
END_FOR_EACH
357
357
pthread_mutex_unlock (& drv -> objectCreationMutex );
358
358
}
359
359
360
360
NVSurface * nvSurfaceFromSurfaceId (NVDriver * drv , VASurfaceID surf ) {
361
- Object obj = getObject (drv , surf );
362
- if (obj != NULL && obj -> type == OBJECT_TYPE_SURFACE ) {
361
+ Object obj = getObject (drv , OBJECT_TYPE_SURFACE , surf );
362
+ if (obj != NULL ) {
363
363
NVSurface * suf = (NVSurface * ) obj -> obj ;
364
364
return suf ;
365
365
}
@@ -428,14 +428,6 @@ static void* resolveSurfaces(void *param) {
428
428
ctx -> surfaceQueueReadIdx = 0 ;
429
429
}
430
430
431
- if (surface -> decodeFailed ) {
432
- pthread_mutex_lock (& surface -> mutex );
433
- surface -> resolving = 0 ;
434
- pthread_cond_signal (& surface -> cond );
435
- pthread_mutex_unlock (& surface -> mutex );
436
- continue ;
437
- }
438
-
439
431
CUdeviceptr deviceMemory = (CUdeviceptr ) NULL ;
440
432
unsigned int pitch = 0 ;
441
433
@@ -447,7 +439,7 @@ static void* resolveSurfaces(void *param) {
447
439
};
448
440
449
441
//LOG("Mapping surface %d", surface->pictureIdx);
450
- if (CHECK_CUDA_RESULT (cv -> cuvidMapVideoFrame (ctx -> decoder , surface -> pictureIdx , & deviceMemory , & pitch , & procParams ))) {
442
+ if (surface -> decodeFailed || CHECK_CUDA_RESULT (cv -> cuvidMapVideoFrame (ctx -> decoder , surface -> pictureIdx , & deviceMemory , & pitch , & procParams ))) {
451
443
pthread_mutex_lock (& surface -> mutex );
452
444
surface -> resolving = 0 ;
453
445
pthread_cond_signal (& surface -> cond );
@@ -841,7 +833,7 @@ static VAStatus nvQueryConfigAttributes(
841
833
)
842
834
{
843
835
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
844
- NVConfig * cfg = (NVConfig * ) getObjectPtr (drv , config_id );
836
+ NVConfig * cfg = (NVConfig * ) getObjectPtr (drv , OBJECT_TYPE_CONFIG , config_id );
845
837
846
838
if (cfg == NULL ) {
847
839
return VA_STATUS_ERROR_INVALID_CONFIG ;
@@ -976,11 +968,9 @@ static VAStatus nvCreateSurfaces2(
976
968
pthread_mutex_init (& suf -> mutex , NULL );
977
969
pthread_cond_init (& suf -> cond , NULL );
978
970
979
- LOG ("Creating surface %dx%d , format %X (%p)" , width , height , format , suf );
971
+ LOG ("Creating surface %ux%u , format %X (%p)" , width , height , format , suf );
980
972
}
981
973
982
- drv -> surfaceCount += num_surfaces ;
983
-
984
974
CHECK_CUDA_RESULT_RETURN (cu -> cuCtxPopCurrent (NULL ), VA_STATUS_ERROR_OPERATION_FAILED );
985
975
986
976
return VA_STATUS_SUCCESS ;
@@ -1008,7 +998,10 @@ static VAStatus nvDestroySurfaces(
1008
998
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1009
999
1010
1000
for (int i = 0 ; i < num_surfaces ; i ++ ) {
1011
- NVSurface * surface = (NVSurface * ) getObjectPtr (drv , surface_list [i ]);
1001
+ NVSurface * surface = (NVSurface * ) getObjectPtr (drv , OBJECT_TYPE_SURFACE , surface_list [i ]);
1002
+ if (!surface ) {
1003
+ return VA_STATUS_ERROR_INVALID_SURFACE ;
1004
+ }
1012
1005
1013
1006
LOG ("Destroying surface %d (%p)" , surface -> pictureIdx , surface );
1014
1007
@@ -1017,8 +1010,6 @@ static VAStatus nvDestroySurfaces(
1017
1010
deleteObject (drv , surface_list [i ]);
1018
1011
}
1019
1012
1020
- drv -> surfaceCount = MAX (drv -> surfaceCount - num_surfaces , 0 );
1021
-
1022
1013
return VA_STATUS_SUCCESS ;
1023
1014
}
1024
1015
@@ -1034,13 +1025,13 @@ static VAStatus nvCreateContext(
1034
1025
)
1035
1026
{
1036
1027
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1037
- NVConfig * cfg = (NVConfig * ) getObjectPtr (drv , config_id );
1028
+ NVConfig * cfg = (NVConfig * ) getObjectPtr (drv , OBJECT_TYPE_CONFIG , config_id );
1038
1029
1039
1030
if (cfg == NULL ) {
1040
1031
return VA_STATUS_ERROR_INVALID_CONFIG ;
1041
1032
}
1042
1033
1043
- LOG ("creating context with %d render targets, %d surfaces, at %dx%d" , num_render_targets , drv -> surfaceCount , picture_width , picture_height );
1034
+ LOG ("creating context with %d render targets, at %dx%d" , num_render_targets , picture_width , picture_height );
1044
1035
1045
1036
//find the codec they've selected
1046
1037
const NVCodec * selectedCodec = NULL ;
@@ -1059,7 +1050,7 @@ static VAStatus nvCreateContext(
1059
1050
1060
1051
if (num_render_targets ) {
1061
1052
// Update the decoder configuration to match the passed in surfaces.
1062
- NVSurface * surface = (NVSurface * ) getObjectPtr (drv , render_targets [0 ]);
1053
+ NVSurface * surface = (NVSurface * ) getObjectPtr (drv , OBJECT_TYPE_SURFACE , render_targets [0 ]);
1063
1054
if (!surface ) {
1064
1055
return VA_STATUS_ERROR_INVALID_PARAMETER ;
1065
1056
}
@@ -1114,10 +1105,6 @@ static VAStatus nvCreateContext(
1114
1105
.ulNumDecodeSurfaces = surfaceCount ,
1115
1106
};
1116
1107
1117
- //reset this to 0 as there are some cases where the context will be destroyed but not terminated, meaning if it's initialised again
1118
- //we'll have even more surfaces
1119
- drv -> surfaceCount = 0 ;
1120
-
1121
1108
CHECK_CUDA_RESULT_RETURN (cv -> cuvidCtxLockCreate (& vdci .vidLock , drv -> cudaContext ), VA_STATUS_ERROR_OPERATION_FAILED );
1122
1109
1123
1110
CUvideodecoder decoder ;
@@ -1160,7 +1147,7 @@ static VAStatus nvDestroyContext(
1160
1147
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1161
1148
LOG ("Destroying context: %d" , context );
1162
1149
1163
- NVContext * nvCtx = (NVContext * ) getObjectPtr (drv , context );
1150
+ NVContext * nvCtx = (NVContext * ) getObjectPtr (drv , OBJECT_TYPE_CONTEXT , context );
1164
1151
1165
1152
if (nvCtx == NULL ) {
1166
1153
return VA_STATUS_ERROR_INVALID_CONTEXT ;
@@ -1190,19 +1177,19 @@ static VAStatus nvCreateBuffer(
1190
1177
//LOG("got buffer %p, type %x, size %u, elements %u", data, type, size, num_elements);
1191
1178
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1192
1179
1193
- NVContext * nvCtx = (NVContext * ) getObjectPtr (drv , context );
1180
+ NVContext * nvCtx = (NVContext * ) getObjectPtr (drv , OBJECT_TYPE_CONTEXT , context );
1194
1181
if (nvCtx == NULL ) {
1195
1182
return VA_STATUS_ERROR_INVALID_CONTEXT ;
1196
1183
}
1197
1184
1198
1185
//HACK: This is an awful hack to support VP8 videos when running within FFMPEG.
1199
1186
//VA-API doesn't pass enough information for NVDEC to work with, but the information is there
1200
1187
//just before the start of the buffer that was passed to us.
1201
- int offset = 0 ;
1188
+ size_t offset = 0 ;
1202
1189
if (nvCtx -> profile == VAProfileVP8Version0_3 && type == VASliceDataBufferType ) {
1203
- offset = (int ) ((( uintptr_t ) data ) & 0xf ) ;
1190
+ offset = (( uintptr_t ) data ) & 0xf ;
1204
1191
data = ((char * ) data ) - offset ;
1205
- size += offset ;
1192
+ size += ( unsigned int ) offset ;
1206
1193
}
1207
1194
1208
1195
//TODO should pool these as most of the time these should be the same size
@@ -1217,7 +1204,7 @@ static VAStatus nvCreateBuffer(
1217
1204
buf -> offset = offset ;
1218
1205
1219
1206
if (buf -> ptr == NULL ) {
1220
- LOG ("Unable to allocate buffer of %d bytes" , buf -> size );
1207
+ LOG ("Unable to allocate buffer of %lu bytes" , buf -> size );
1221
1208
return VA_STATUS_ERROR_ALLOCATION_FAILED ;
1222
1209
}
1223
1210
@@ -1245,7 +1232,7 @@ static VAStatus nvMapBuffer(
1245
1232
)
1246
1233
{
1247
1234
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1248
- NVBuffer * buf = getObjectPtr (drv , buf_id );
1235
+ NVBuffer * buf = getObjectPtr (drv , OBJECT_TYPE_BUFFER , buf_id );
1249
1236
1250
1237
if (buf == NULL ) {
1251
1238
return VA_STATUS_ERROR_INVALID_BUFFER ;
@@ -1270,7 +1257,7 @@ static VAStatus nvDestroyBuffer(
1270
1257
)
1271
1258
{
1272
1259
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1273
- NVBuffer * buf = getObjectPtr (drv , buffer_id );
1260
+ NVBuffer * buf = getObjectPtr (drv , OBJECT_TYPE_BUFFER , buffer_id );
1274
1261
1275
1262
if (buf == NULL ) {
1276
1263
return VA_STATUS_ERROR_INVALID_BUFFER ;
@@ -1292,8 +1279,12 @@ static VAStatus nvBeginPicture(
1292
1279
)
1293
1280
{
1294
1281
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1295
- NVContext * nvCtx = (NVContext * ) getObjectPtr (drv , context );
1296
- NVSurface * surface = (NVSurface * ) getObjectPtr (drv , render_target );
1282
+ NVContext * nvCtx = (NVContext * ) getObjectPtr (drv , OBJECT_TYPE_CONTEXT , context );
1283
+ NVSurface * surface = (NVSurface * ) getObjectPtr (drv , OBJECT_TYPE_SURFACE , render_target );
1284
+
1285
+ if (nvCtx == NULL ) {
1286
+ return VA_STATUS_ERROR_INVALID_CONTEXT ;
1287
+ }
1297
1288
1298
1289
if (surface == NULL ) {
1299
1290
return VA_STATUS_ERROR_INVALID_SURFACE ;
@@ -1338,7 +1329,7 @@ static VAStatus nvRenderPicture(
1338
1329
)
1339
1330
{
1340
1331
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1341
- NVContext * nvCtx = (NVContext * ) getObjectPtr (drv , context );
1332
+ NVContext * nvCtx = (NVContext * ) getObjectPtr (drv , OBJECT_TYPE_CONTEXT , context );
1342
1333
1343
1334
if (nvCtx == NULL ) {
1344
1335
return VA_STATUS_ERROR_INVALID_CONTEXT ;
@@ -1347,7 +1338,7 @@ static VAStatus nvRenderPicture(
1347
1338
CUVIDPICPARAMS * picParams = & nvCtx -> pPicParams ;
1348
1339
1349
1340
for (int i = 0 ; i < num_buffers ; i ++ ) {
1350
- NVBuffer * buf = (NVBuffer * ) getObject (drv , buffers [i ])-> obj ;
1341
+ NVBuffer * buf = (NVBuffer * ) getObjectPtr (drv , OBJECT_TYPE_BUFFER , buffers [i ]);
1351
1342
if (buf == NULL || buf -> ptr == NULL ) {
1352
1343
LOG ("Invalid buffer detected, skipping: %d" , buffers [i ]);
1353
1344
continue ;
@@ -1369,7 +1360,7 @@ static VAStatus nvEndPicture(
1369
1360
)
1370
1361
{
1371
1362
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1372
- NVContext * nvCtx = (NVContext * ) getObject (drv , context )-> obj ;
1363
+ NVContext * nvCtx = (NVContext * ) getObjectPtr (drv , OBJECT_TYPE_CONTEXT , context );
1373
1364
1374
1365
if (nvCtx == NULL ) {
1375
1366
return VA_STATUS_ERROR_INVALID_CONTEXT ;
@@ -1422,7 +1413,7 @@ static VAStatus nvSyncSurface(
1422
1413
)
1423
1414
{
1424
1415
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1425
- NVSurface * surface = getObjectPtr (drv , render_target );
1416
+ NVSurface * surface = getObjectPtr (drv , OBJECT_TYPE_SURFACE , render_target );
1426
1417
1427
1418
if (surface == NULL ) {
1428
1419
return VA_STATUS_ERROR_INVALID_SURFACE ;
@@ -1597,13 +1588,14 @@ static VAStatus nvDestroyImage(
1597
1588
)
1598
1589
{
1599
1590
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1600
- NVImage * img = (NVImage * ) getObjectPtr (drv , image );
1591
+ NVImage * img = (NVImage * ) getObjectPtr (drv , OBJECT_TYPE_IMAGE , image );
1601
1592
1602
1593
if (img == NULL ) {
1603
1594
return VA_STATUS_ERROR_INVALID_IMAGE ;
1604
1595
}
1605
1596
1606
- Object imageBufferObj = getObjectByPtr (drv , img -> imageBuffer );
1597
+ Object imageBufferObj = getObjectByPtr (drv , OBJECT_TYPE_BUFFER , img -> imageBuffer );
1598
+
1607
1599
if (imageBufferObj != NULL ) {
1608
1600
if (img -> imageBuffer -> ptr != NULL ) {
1609
1601
free (img -> imageBuffer -> ptr );
@@ -1644,8 +1636,17 @@ static VAStatus nvGetImage(
1644
1636
{
1645
1637
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1646
1638
1647
- NVSurface * surfaceObj = (NVSurface * ) getObject (drv , surface )-> obj ;
1648
- NVImage * imageObj = (NVImage * ) getObject (drv , image )-> obj ;
1639
+ NVSurface * surfaceObj = (NVSurface * ) getObjectPtr (drv , OBJECT_TYPE_SURFACE , surface );
1640
+ NVImage * imageObj = (NVImage * ) getObjectPtr (drv , OBJECT_TYPE_IMAGE , image );
1641
+
1642
+ if (surfaceObj == NULL ) {
1643
+ return VA_STATUS_ERROR_INVALID_SURFACE ;
1644
+ }
1645
+
1646
+ if (imageObj == NULL ) {
1647
+ return VA_STATUS_ERROR_INVALID_IMAGE ;
1648
+ }
1649
+
1649
1650
NVContext * context = (NVContext * ) surfaceObj -> context ;
1650
1651
const NVFormatInfo * fmtInfo = & formatsInfo [imageObj -> format ];
1651
1652
uint32_t offset = 0 ;
@@ -1842,7 +1843,7 @@ static VAStatus nvQuerySurfaceAttributes(
1842
1843
)
1843
1844
{
1844
1845
NVDriver * drv = (NVDriver * ) ctx -> pDriverData ;
1845
- NVConfig * cfg = (NVConfig * ) getObjectPtr (drv , config );
1846
+ NVConfig * cfg = (NVConfig * ) getObjectPtr (drv , OBJECT_TYPE_CONFIG , config );
1846
1847
1847
1848
if (cfg == NULL ) {
1848
1849
return VA_STATUS_ERROR_INVALID_CONFIG ;
@@ -2113,7 +2114,7 @@ static VAStatus nvExportSurfaceHandle(
2113
2114
return VA_STATUS_ERROR_INVALID_SURFACE ;
2114
2115
}
2115
2116
2116
- NVSurface * surface = (NVSurface * ) getObjectPtr (drv , surface_id );
2117
+ NVSurface * surface = (NVSurface * ) getObjectPtr (drv , OBJECT_TYPE_SURFACE , surface_id );
2117
2118
if (surface == NULL ) {
2118
2119
return VA_STATUS_ERROR_INVALID_SURFACE ;
2119
2120
}
0 commit comments