parent
abe150c9de
commit
072788c46e
13 changed files with 281 additions and 58 deletions
@ -1,34 +0,0 @@ |
|||||||
#!/bin/sh |
|
||||||
|
|
||||||
# Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved. |
|
||||||
# |
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a |
|
||||||
# copy of this software and associated documentation files (the "Software"), |
|
||||||
# to deal in the Software without restriction, including without limitation |
|
||||||
# the rights to use, copy, modify, merge, publish, distribute, sublicense, |
|
||||||
# and/or sell copies of the Software, and to permit persons to whom the |
|
||||||
# Software is furnished to do so, subject to the following conditions: |
|
||||||
# |
|
||||||
# The above copyright notice and this permission notice shall be included in |
|
||||||
# all copies or substantial portions of the Software. |
|
||||||
# |
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
|
||||||
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
||||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
||||||
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
|
||||||
# DEALINGS IN THE SOFTWARE. |
|
||||||
|
|
||||||
set -e |
|
||||||
|
|
||||||
OUT="$1" |
|
||||||
IN="$2" |
|
||||||
NAME="$(basename "$IN" | sed 's/\..*//')" |
|
||||||
|
|
||||||
printf "const char %s_ptx[] = \\" "$NAME" > "$OUT" |
|
||||||
echo >> "$OUT" |
|
||||||
sed -e "$(printf 's/\r//g')" -e 's/["\\]/\\&/g' -e "$(printf 's/^/\t"/')" -e 's/$/\\n"/' < "$IN" >> "$OUT" |
|
||||||
echo ";" >> "$OUT" |
|
||||||
|
|
||||||
exit 0 |
|
@ -0,0 +1,76 @@ |
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg. |
||||||
|
* |
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a |
||||||
|
* copy of this software and associated documentation files (the "Software"), |
||||||
|
* to deal in the Software without restriction, including without limitation |
||||||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||||
|
* and/or sell copies of the Software, and to permit persons to whom the |
||||||
|
* Software is furnished to do so, subject to the following conditions: |
||||||
|
* |
||||||
|
* The above copyright notice and this permission notice shall be included in |
||||||
|
* all copies or substantial portions of the Software. |
||||||
|
* |
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||||
|
* DEALINGS IN THE SOFTWARE. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <string.h> |
||||||
|
#include <stdio.h> |
||||||
|
|
||||||
|
int main(int argc, char **argv) |
||||||
|
{ |
||||||
|
const char *name; |
||||||
|
FILE *input, *output; |
||||||
|
unsigned int length = 0; |
||||||
|
unsigned char data; |
||||||
|
|
||||||
|
if (argc < 3 || argc > 4) |
||||||
|
return 1; |
||||||
|
|
||||||
|
input = fopen(argv[1], "rb"); |
||||||
|
if (!input) |
||||||
|
return -1; |
||||||
|
|
||||||
|
output = fopen(argv[2], "wb"); |
||||||
|
if (!output) |
||||||
|
return -1; |
||||||
|
|
||||||
|
if (argc == 4) { |
||||||
|
name = argv[3]; |
||||||
|
} else { |
||||||
|
size_t arglen = strlen(argv[1]); |
||||||
|
name = argv[1]; |
||||||
|
|
||||||
|
for (int i = 0; i < arglen; i++) { |
||||||
|
if (argv[1][i] == '.') |
||||||
|
argv[1][i] = '_'; |
||||||
|
else if (argv[1][i] == '/') |
||||||
|
name = &argv[1][i+1]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fprintf(output, "const unsigned char ff_%s_data[] = { ", name); |
||||||
|
|
||||||
|
while (fread(&data, 1, 1, input) > 0) { |
||||||
|
fprintf(output, "0x%02x, ", data); |
||||||
|
length++; |
||||||
|
} |
||||||
|
|
||||||
|
fprintf(output, "0x00 };\n"); |
||||||
|
fprintf(output, "const unsigned int ff_%s_len = %u;\n", name, length); |
||||||
|
|
||||||
|
fclose(output); |
||||||
|
|
||||||
|
if (ferror(input) || !feof(input)) |
||||||
|
return -1; |
||||||
|
|
||||||
|
fclose(input); |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
@ -0,0 +1,96 @@ |
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg. |
||||||
|
* |
||||||
|
* FFmpeg is free software; you can redistribute it and/or |
||||||
|
* modify it under the terms of the GNU Lesser General Public |
||||||
|
* License as published by the Free Software Foundation; either |
||||||
|
* version 2.1 of the License, or (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpeg is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||||
|
* Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public |
||||||
|
* License along with FFmpeg; if not, write to the Free Software |
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "config.h" |
||||||
|
|
||||||
|
#include "libavutil/hwcontext.h" |
||||||
|
#include "libavutil/hwcontext_cuda_internal.h" |
||||||
|
#include "libavutil/cuda_check.h" |
||||||
|
|
||||||
|
#if CONFIG_PTX_COMPRESSION |
||||||
|
#include <zlib.h> |
||||||
|
#define CHUNK_SIZE 1024 * 64 |
||||||
|
#endif |
||||||
|
|
||||||
|
#include "load_helper.h" |
||||||
|
|
||||||
|
#define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, cu, x) |
||||||
|
|
||||||
|
int ff_cuda_load_module(void *avctx, AVCUDADeviceContext *hwctx, CUmodule *cu_module, |
||||||
|
const unsigned char *data, const unsigned int length) |
||||||
|
{ |
||||||
|
CudaFunctions *cu = hwctx->internal->cuda_dl; |
||||||
|
|
||||||
|
#if CONFIG_PTX_COMPRESSION |
||||||
|
z_stream stream = { 0 }; |
||||||
|
uint8_t *buf, *tmp; |
||||||
|
uint64_t buf_size; |
||||||
|
int ret; |
||||||
|
|
||||||
|
if (inflateInit2(&stream, 32 + 15) != Z_OK) { |
||||||
|
av_log(avctx, AV_LOG_ERROR, "Error during zlib initialisation: %s\n", stream.msg); |
||||||
|
return AVERROR(ENOSYS); |
||||||
|
} |
||||||
|
|
||||||
|
buf_size = CHUNK_SIZE * 4; |
||||||
|
buf = av_realloc(NULL, buf_size); |
||||||
|
if (!buf) { |
||||||
|
inflateEnd(&stream); |
||||||
|
return AVERROR(ENOMEM); |
||||||
|
} |
||||||
|
|
||||||
|
stream.next_in = data; |
||||||
|
stream.avail_in = length; |
||||||
|
|
||||||
|
do { |
||||||
|
stream.avail_out = buf_size - stream.total_out; |
||||||
|
stream.next_out = buf + stream.total_out; |
||||||
|
|
||||||
|
ret = inflate(&stream, Z_FINISH); |
||||||
|
if (ret != Z_OK && ret != Z_STREAM_END) { |
||||||
|
av_log(avctx, AV_LOG_ERROR, "zlib inflate error: %s\n", stream.msg); |
||||||
|
inflateEnd(&stream); |
||||||
|
av_free(buf); |
||||||
|
return AVERROR(EINVAL); |
||||||
|
} |
||||||
|
|
||||||
|
if (stream.avail_out == 0) { |
||||||
|
buf_size += CHUNK_SIZE; |
||||||
|
tmp = av_realloc(buf, buf_size); |
||||||
|
if (!tmp) { |
||||||
|
inflateEnd(&stream); |
||||||
|
av_free(buf); |
||||||
|
return AVERROR(ENOMEM); |
||||||
|
} |
||||||
|
buf = tmp; |
||||||
|
} |
||||||
|
} while (ret != Z_STREAM_END); |
||||||
|
|
||||||
|
// NULL-terminate string
|
||||||
|
// there is guaranteed to be space for this, due to condition in loop
|
||||||
|
buf[stream.total_out] = 0; |
||||||
|
|
||||||
|
inflateEnd(&stream); |
||||||
|
|
||||||
|
ret = CHECK_CU(cu->cuModuleLoadData(cu_module, buf)); |
||||||
|
av_free(buf); |
||||||
|
return ret; |
||||||
|
#else |
||||||
|
return CHECK_CU(cu->cuModuleLoadData(cu_module, data)); |
||||||
|
#endif |
||||||
|
} |
@ -0,0 +1,28 @@ |
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg. |
||||||
|
* |
||||||
|
* FFmpeg is free software; you can redistribute it and/or |
||||||
|
* modify it under the terms of the GNU Lesser General Public |
||||||
|
* License as published by the Free Software Foundation; either |
||||||
|
* version 2.1 of the License, or (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpeg is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||||
|
* Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public |
||||||
|
* License along with FFmpeg; if not, write to the Free Software |
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef AVFILTER_CUDA_DECOMPRESS_H |
||||||
|
#define AVFILTER_CUDA_DECOMPRESS_H |
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a CUDA module and applies any decompression, if neccesary. |
||||||
|
*/ |
||||||
|
int ff_cuda_load_module(void *avctx, AVCUDADeviceContext *hwctx, CUmodule *cu_module, |
||||||
|
const unsigned char *data, const unsigned int length); |
||||||
|
|
||||||
|
#endif |
Loading…
Reference in new issue