Commit 885158c8 authored by Michael Niedermayer's avatar Michael Niedermayer

Move av_tempfile() into libavutil, it is a generically usefull thing and its small.

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 7f16ec61
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <xvid.h> #include <xvid.h>
#include <unistd.h> #include <unistd.h>
#include "libavutil/file.h"
#include "avcodec.h" #include "avcodec.h"
#include "libxvid_internal.h" #include "libxvid_internal.h"
//#include "dsputil.h" //#include "dsputil.h"
...@@ -40,7 +41,7 @@ int ff_xvid_rate_control_init(MpegEncContext *s){ ...@@ -40,7 +41,7 @@ int ff_xvid_rate_control_init(MpegEncContext *s){
//xvid_debug=-1; //xvid_debug=-1;
fd=ff_tempfile("xvidrc.", &tmp_name); fd=av_tempfile("xvidrc.", &tmp_name);
if (fd == -1) { if (fd == -1) {
av_log(NULL, AV_LOG_ERROR, "Can't create temporary pass2 file.\n"); av_log(NULL, AV_LOG_ERROR, "Can't create temporary pass2 file.\n");
return -1; return -1;
......
...@@ -28,13 +28,11 @@ ...@@ -28,13 +28,11 @@
#include <xvid.h> #include <xvid.h>
#include <unistd.h> #include <unistd.h>
#include "avcodec.h" #include "avcodec.h"
#include "libavutil/file.h"
#include "libavutil/cpu.h" #include "libavutil/cpu.h"
#include "libavutil/intreadwrite.h" #include "libavutil/intreadwrite.h"
#include "libavutil/mathematics.h" #include "libavutil/mathematics.h"
#include "libxvid_internal.h" #include "libxvid_internal.h"
#if !HAVE_MKSTEMP
#include <fcntl.h>
#endif
/** /**
* Buffer management macros. * Buffer management macros.
...@@ -77,42 +75,6 @@ int xvid_strip_vol_header(AVCodecContext *avctx, unsigned char *frame, unsigned ...@@ -77,42 +75,6 @@ int xvid_strip_vol_header(AVCodecContext *avctx, unsigned char *frame, unsigned
int xvid_ff_2pass(void *ref, int opt, void *p1, void *p2); int xvid_ff_2pass(void *ref, int opt, void *p1, void *p2);
void xvid_correct_framerate(AVCodecContext *avctx); void xvid_correct_framerate(AVCodecContext *avctx);
/* Wrapper to work around the lack of mkstemp() on mingw.
* Also, tries to create file in /tmp first, if possible.
* *prefix can be a character constant; *filename will be allocated internally.
* @return file descriptor of opened file (or -1 on error)
* and opened file name in **filename. */
int ff_tempfile(const char *prefix, char **filename) {
int fd=-1;
#if !HAVE_MKSTEMP
*filename = tempnam(".", prefix);
#else
size_t len = strlen(prefix) + 12; /* room for "/tmp/" and "XXXXXX\0" */
*filename = av_malloc(len);
#endif
/* -----common section-----*/
if (*filename == NULL) {
av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot allocate file name\n");
return -1;
}
#if !HAVE_MKSTEMP
fd = open(*filename, O_RDWR | O_BINARY | O_CREAT, 0444);
#else
snprintf(*filename, len, "/tmp/%sXXXXXX", prefix);
fd = mkstemp(*filename);
if (fd < 0) {
snprintf(*filename, len, "./%sXXXXXX", prefix);
fd = mkstemp(*filename);
}
#endif
/* -----common section-----*/
if (fd < 0) {
av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot open temporary file %s\n", *filename);
return -1;
}
return fd; /* success */
}
#if CONFIG_LIBXVID_ENCODER #if CONFIG_LIBXVID_ENCODER
/** /**
...@@ -270,7 +232,7 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx) { ...@@ -270,7 +232,7 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx) {
rc2pass2.version = XVID_VERSION; rc2pass2.version = XVID_VERSION;
rc2pass2.bitrate = avctx->bit_rate; rc2pass2.bitrate = avctx->bit_rate;
fd = ff_tempfile("xvidff.", &(x->twopassfile)); fd = av_tempfile("xvidff.", &(x->twopassfile));
if( fd == -1 ) { if( fd == -1 ) {
av_log(avctx, AV_LOG_ERROR, av_log(avctx, AV_LOG_ERROR,
"Xvid: Cannot write 2-pass pipe\n"); "Xvid: Cannot write 2-pass pipe\n");
......
...@@ -130,6 +130,37 @@ void av_file_unmap(uint8_t *bufptr, size_t size) ...@@ -130,6 +130,37 @@ void av_file_unmap(uint8_t *bufptr, size_t size)
#endif #endif
} }
int av_tempfile(const char *prefix, char **filename) {
int fd=-1;
#if !HAVE_MKSTEMP
*filename = tempnam(".", prefix);
#else
size_t len = strlen(prefix) + 12; /* room for "/tmp/" and "XXXXXX\0" */
*filename = av_malloc(len);
#endif
/* -----common section-----*/
if (*filename == NULL) {
av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot allocate file name\n");
return -1;
}
#if !HAVE_MKSTEMP
fd = open(*filename, O_RDWR | O_BINARY | O_CREAT, 0444);
#else
snprintf(*filename, len, "/tmp/%sXXXXXX", prefix);
fd = mkstemp(*filename);
if (fd < 0) {
snprintf(*filename, len, "./%sXXXXXX", prefix);
fd = mkstemp(*filename);
}
#endif
/* -----common section-----*/
if (fd < 0) {
av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot open temporary file %s\n", *filename);
return -1;
}
return fd; /* success */
}
#ifdef TEST #ifdef TEST
#undef printf #undef printf
......
...@@ -49,4 +49,13 @@ int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, ...@@ -49,4 +49,13 @@ int av_file_map(const char *filename, uint8_t **bufptr, size_t *size,
*/ */
void av_file_unmap(uint8_t *bufptr, size_t size); void av_file_unmap(uint8_t *bufptr, size_t size);
/**
* Wrapper to work around the lack of mkstemp() on mingw.
* Also, tries to create file in /tmp first, if possible.
* *prefix can be a character constant; *filename will be allocated internally.
* @return file descriptor of opened file (or -1 on error)
* and opened file name in **filename.
*/
int av_tempfile(const char *prefix, char **filename);
#endif /* AVUTIL_FILE_H */ #endif /* AVUTIL_FILE_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment