Commit a33ed6bc authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit 'b7f1010c'

* commit 'b7f1010c':
  tools: do not use av_pix_fmt_descriptors directly.
  pixdesc: add functions for accessing pixel format descriptors.
  build: add support for Tru64 (OSF/1)
  md5: Allocate a normal private context for the opaque md5 context pointer

Conflicts:
	cmdutils.c
	doc/APIchanges
	ffprobe.c
	libavformat/md5enc.c
	libavutil/version.h
	tools/graph2dot.c
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents f391e405 b7f1010c
...@@ -1094,7 +1094,7 @@ int show_filters(void *optctx, const char *opt, const char *arg) ...@@ -1094,7 +1094,7 @@ int show_filters(void *optctx, const char *opt, const char *arg)
int show_pix_fmts(void *optctx, const char *opt, const char *arg) int show_pix_fmts(void *optctx, const char *opt, const char *arg)
{ {
enum AVPixelFormat pix_fmt; const AVPixFmtDescriptor *pix_desc = NULL;
printf("Pixel formats:\n" printf("Pixel formats:\n"
"I.... = Supported Input format for conversion\n" "I.... = Supported Input format for conversion\n"
...@@ -1110,8 +1110,8 @@ int show_pix_fmts(void *optctx, const char *opt, const char *arg) ...@@ -1110,8 +1110,8 @@ int show_pix_fmts(void *optctx, const char *opt, const char *arg)
# define sws_isSupportedOutput(x) 0 # define sws_isSupportedOutput(x) 0
#endif #endif
for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++) { while ((pix_desc = av_pix_fmt_desc_next(pix_desc))) {
const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt]; enum AVPixelFormat pix_fmt = av_pix_fmt_desc_get_id(pix_desc);
if(!pix_desc->name) if(!pix_desc->name)
continue; continue;
printf("%c%c%c%c%c %-16s %d %2d\n", printf("%c%c%c%c%c %-16s %d %2d\n",
...@@ -1484,13 +1484,19 @@ void *grow_array(void *array, int elem_size, int *size, int new_size) ...@@ -1484,13 +1484,19 @@ void *grow_array(void *array, int elem_size, int *size, int new_size)
static int alloc_buffer(FrameBuffer **pool, AVCodecContext *s, FrameBuffer **pbuf) static int alloc_buffer(FrameBuffer **pool, AVCodecContext *s, FrameBuffer **pbuf)
{ {
FrameBuffer *buf = av_mallocz(sizeof(*buf)); const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->pix_fmt);
FrameBuffer *buf;
int i, ret; int i, ret;
const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1; int pixel_size;
int h_chroma_shift, v_chroma_shift; int h_chroma_shift, v_chroma_shift;
int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
int w = s->width, h = s->height; int w = s->width, h = s->height;
if (!desc)
return AVERROR(EINVAL);
pixel_size = desc->comp[0].step_minus1 + 1;
buf = av_mallocz(sizeof(*buf));
if (!buf) if (!buf)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
......
...@@ -3189,6 +3189,10 @@ case $target_os in ...@@ -3189,6 +3189,10 @@ case $target_os in
-l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \ -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \
-l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib
;; ;;
osf1)
add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT
FFSERVERLDFLAGS=
;;
none) none)
;; ;;
*) *)
......
...@@ -97,6 +97,11 @@ API changes, most recent first: ...@@ -97,6 +97,11 @@ API changes, most recent first:
2012-03-26 - a67d9cf - lavfi 2.66.100 2012-03-26 - a67d9cf - lavfi 2.66.100
Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions. Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions.
2012-10-12 - xxxxxxx - lavu 51.44.0 - pixdesc.h
Add functions for accessing pixel format descriptors.
Accessing the av_pix_fmt_descriptors array directly is now
deprecated.
2012-10-xx - xxxxxxx - lavu 51.43.0 - aes.h, md5.h, sha.h, tree.h 2012-10-xx - xxxxxxx - lavu 51.43.0 - aes.h, md5.h, sha.h, tree.h
Add functions for allocating the opaque contexts for the algorithms, Add functions for allocating the opaque contexts for the algorithms,
deprecate the context size variables. deprecate the context size variables.
......
...@@ -23,13 +23,16 @@ ...@@ -23,13 +23,16 @@
#include "avformat.h" #include "avformat.h"
#include "internal.h" #include "internal.h"
#define PRIVSIZE 512 struct MD5Context {
struct AVMD5 *md5;
};
static void md5_finish(struct AVFormatContext *s, char *buf) static void md5_finish(struct AVFormatContext *s, char *buf)
{ {
struct MD5Context *c = s->priv_data;
uint8_t md5[16]; uint8_t md5[16];
int i, offset = strlen(buf); int i, offset = strlen(buf);
av_md5_final(s->priv_data, md5); av_md5_final(c->md5, md5);
for (i = 0; i < sizeof(md5); i++) { for (i = 0; i < sizeof(md5); i++) {
snprintf(buf + offset, 3, "%02"PRIx8, md5[i]); snprintf(buf + offset, 3, "%02"PRIx8, md5[i]);
offset += 2; offset += 2;
...@@ -44,32 +47,36 @@ static void md5_finish(struct AVFormatContext *s, char *buf) ...@@ -44,32 +47,36 @@ static void md5_finish(struct AVFormatContext *s, char *buf)
#if CONFIG_MD5_MUXER #if CONFIG_MD5_MUXER
static int write_header(struct AVFormatContext *s) static int write_header(struct AVFormatContext *s)
{ {
if (PRIVSIZE < av_md5_size) { struct MD5Context *c = s->priv_data;
av_log(s, AV_LOG_ERROR, "Insuffient size for md5 context\n"); c->md5 = av_md5_alloc();
return -1; if (!c->md5)
} return AVERROR(ENOMEM);
av_md5_init(s->priv_data); av_md5_init(c->md5);
return 0; return 0;
} }
static int write_packet(struct AVFormatContext *s, AVPacket *pkt) static int write_packet(struct AVFormatContext *s, AVPacket *pkt)
{ {
av_md5_update(s->priv_data, pkt->data, pkt->size); struct MD5Context *c = s->priv_data;
av_md5_update(c->md5, pkt->data, pkt->size);
return 0; return 0;
} }
static int write_trailer(struct AVFormatContext *s) static int write_trailer(struct AVFormatContext *s)
{ {
struct MD5Context *c = s->priv_data;
char buf[64] = "MD5="; char buf[64] = "MD5=";
md5_finish(s, buf); md5_finish(s, buf);
av_freep(&c->md5);
return 0; return 0;
} }
AVOutputFormat ff_md5_muxer = { AVOutputFormat ff_md5_muxer = {
.name = "md5", .name = "md5",
.long_name = NULL_IF_CONFIG_SMALL("MD5 testing"), .long_name = NULL_IF_CONFIG_SMALL("MD5 testing"),
.priv_data_size = PRIVSIZE, .priv_data_size = sizeof(struct MD5Context),
.audio_codec = AV_CODEC_ID_PCM_S16LE, .audio_codec = AV_CODEC_ID_PCM_S16LE,
.video_codec = AV_CODEC_ID_RAWVIDEO, .video_codec = AV_CODEC_ID_RAWVIDEO,
.write_header = write_header, .write_header = write_header,
...@@ -80,15 +87,21 @@ AVOutputFormat ff_md5_muxer = { ...@@ -80,15 +87,21 @@ AVOutputFormat ff_md5_muxer = {
#endif #endif
#if CONFIG_FRAMEMD5_MUXER #if CONFIG_FRAMEMD5_MUXER
static int framemd5_write_header(struct AVFormatContext *s)
{
struct MD5Context *c = s->priv_data;
c->md5 = av_md5_alloc();
if (!c->md5)
return AVERROR(ENOMEM);
return ff_framehash_write_header(s);
}
static int framemd5_write_packet(struct AVFormatContext *s, AVPacket *pkt) static int framemd5_write_packet(struct AVFormatContext *s, AVPacket *pkt)
{ {
struct MD5Context *c = s->priv_data;
char buf[256]; char buf[256];
if (PRIVSIZE < av_md5_size) { av_md5_init(c->md5);
av_log(s, AV_LOG_ERROR, "Insuffient size for md5 context\n"); av_md5_update(c->md5, pkt->data, pkt->size);
return -1;
}
av_md5_init(s->priv_data);
av_md5_update(s->priv_data, pkt->data, pkt->size);
snprintf(buf, sizeof(buf) - 64, "%d, %10"PRId64", %10"PRId64", %8d, %8d, ", snprintf(buf, sizeof(buf) - 64, "%d, %10"PRId64", %10"PRId64", %8d, %8d, ",
pkt->stream_index, pkt->dts, pkt->pts, pkt->duration, pkt->size); pkt->stream_index, pkt->dts, pkt->pts, pkt->duration, pkt->size);
...@@ -96,14 +109,22 @@ static int framemd5_write_packet(struct AVFormatContext *s, AVPacket *pkt) ...@@ -96,14 +109,22 @@ static int framemd5_write_packet(struct AVFormatContext *s, AVPacket *pkt)
return 0; return 0;
} }
static int framemd5_write_trailer(struct AVFormatContext *s)
{
struct MD5Context *c = s->priv_data;
av_freep(&c->md5);
return 0;
}
AVOutputFormat ff_framemd5_muxer = { AVOutputFormat ff_framemd5_muxer = {
.name = "framemd5", .name = "framemd5",
.long_name = NULL_IF_CONFIG_SMALL("Per-frame MD5 testing"), .long_name = NULL_IF_CONFIG_SMALL("Per-frame MD5 testing"),
.priv_data_size = PRIVSIZE, .priv_data_size = sizeof(struct MD5Context),
.audio_codec = AV_CODEC_ID_PCM_S16LE, .audio_codec = AV_CODEC_ID_PCM_S16LE,
.video_codec = AV_CODEC_ID_RAWVIDEO, .video_codec = AV_CODEC_ID_RAWVIDEO,
.write_header = ff_framehash_write_header, .write_header = framemd5_write_header,
.write_packet = framemd5_write_packet, .write_packet = framemd5_write_packet,
.write_trailer = framemd5_write_trailer,
.flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT, .flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT,
}; };
#endif #endif
...@@ -27,37 +27,41 @@ ...@@ -27,37 +27,41 @@
#include "avio.h" #include "avio.h"
#include "url.h" #include "url.h"
#define PRIV_SIZE 128 struct MD5Context {
struct AVMD5 *md5;
};
static int md5_open(URLContext *h, const char *filename, int flags) static int md5_open(URLContext *h, const char *filename, int flags)
{ {
if (PRIV_SIZE < av_md5_size) { struct MD5Context *c = h->priv_data;
av_log(NULL, AV_LOG_ERROR, "Insuffient size for MD5 context\n");
return -1;
}
if (!(flags & AVIO_FLAG_WRITE)) if (!(flags & AVIO_FLAG_WRITE))
return AVERROR(EINVAL); return AVERROR(EINVAL);
av_md5_init(h->priv_data); c->md5 = av_md5_alloc();
if (!c->md5)
return AVERROR(ENOMEM);
av_md5_init(c->md5);
return 0; return 0;
} }
static int md5_write(URLContext *h, const unsigned char *buf, int size) static int md5_write(URLContext *h, const unsigned char *buf, int size)
{ {
av_md5_update(h->priv_data, buf, size); struct MD5Context *c = h->priv_data;
av_md5_update(c->md5, buf, size);
return size; return size;
} }
static int md5_close(URLContext *h) static int md5_close(URLContext *h)
{ {
struct MD5Context *c = h->priv_data;
const char *filename = h->filename; const char *filename = h->filename;
uint8_t md5[16], buf[64]; uint8_t md5[16], buf[64];
URLContext *out; URLContext *out;
int i, err = 0; int i, err = 0;
av_md5_final(h->priv_data, md5); av_md5_final(c->md5, md5);
for (i = 0; i < sizeof(md5); i++) for (i = 0; i < sizeof(md5); i++)
snprintf(buf + i*2, 3, "%02x", md5[i]); snprintf(buf + i*2, 3, "%02x", md5[i]);
buf[i*2] = '\n'; buf[i*2] = '\n';
...@@ -76,6 +80,8 @@ static int md5_close(URLContext *h) ...@@ -76,6 +80,8 @@ static int md5_close(URLContext *h)
err = AVERROR(errno); err = AVERROR(errno);
} }
av_freep(&c->md5);
return err; return err;
} }
...@@ -85,5 +91,5 @@ URLProtocol ff_md5_protocol = { ...@@ -85,5 +91,5 @@ URLProtocol ff_md5_protocol = {
.url_open = md5_open, .url_open = md5_open,
.url_write = md5_write, .url_write = md5_write,
.url_close = md5_close, .url_close = md5_close,
.priv_data_size = PRIV_SIZE, .priv_data_size = sizeof(struct MD5Context),
}; };
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "common.h"
#include "pixfmt.h" #include "pixfmt.h"
#include "pixdesc.h" #include "pixdesc.h"
...@@ -122,6 +124,9 @@ void av_write_image_line(const uint16_t *src, ...@@ -122,6 +124,9 @@ void av_write_image_line(const uint16_t *src,
} }
} }
#if !FF_API_PIX_FMT_DESC
static
#endif
const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
[AV_PIX_FMT_YUV420P] = { [AV_PIX_FMT_YUV420P] = {
.name = "yuv420p", .name = "yuv420p",
...@@ -1485,3 +1490,28 @@ char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt ...@@ -1485,3 +1490,28 @@ char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt
return buf; return buf;
} }
const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
{
if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
return NULL;
return &av_pix_fmt_descriptors[pix_fmt];
}
const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
{
if (!prev)
return &av_pix_fmt_descriptors[0];
if (prev - av_pix_fmt_descriptors < FF_ARRAY_ELEMS(av_pix_fmt_descriptors) - 1)
return prev + 1;
return NULL;
}
enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
{
if (desc < av_pix_fmt_descriptors ||
desc >= av_pix_fmt_descriptors + FF_ARRAY_ELEMS(av_pix_fmt_descriptors))
return AV_PIX_FMT_NONE;
return desc - av_pix_fmt_descriptors;
}
...@@ -99,10 +99,12 @@ typedef struct AVPixFmtDescriptor{ ...@@ -99,10 +99,12 @@ typedef struct AVPixFmtDescriptor{
*/ */
#define PIX_FMT_PSEUDOPAL 64 #define PIX_FMT_PSEUDOPAL 64
#if FF_API_PIX_FMT_DESC
/** /**
* The array of all the pixel format descriptors. * The array of all the pixel format descriptors.
*/ */
extern const AVPixFmtDescriptor av_pix_fmt_descriptors[]; extern const AVPixFmtDescriptor av_pix_fmt_descriptors[];
#endif
/** /**
* Read a line from an image, and write the values of the * Read a line from an image, and write the values of the
...@@ -183,4 +185,25 @@ char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt ...@@ -183,4 +185,25 @@ char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt
*/ */
int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc);
/**
* @return a pixel format descriptor for provided pixel format or NULL if
* this pixel format is unknown.
*/
const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt);
/**
* Iterate over all pixel format descriptors known to libavutil.
*
* @param prev previous descriptor. NULL to get the first descriptor.
*
* @return next descriptor or NULL after the last descriptor
*/
const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev);
/**
* @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc
* is not a valid pointer to a pixel format descriptor.
*/
enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc);
#endif /* AVUTIL_PIXDESC_H */ #endif /* AVUTIL_PIXDESC_H */
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
*/ */
#define LIBAVUTIL_VERSION_MAJOR 51 #define LIBAVUTIL_VERSION_MAJOR 51
#define LIBAVUTIL_VERSION_MINOR 75 #define LIBAVUTIL_VERSION_MINOR 76
#define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
...@@ -87,6 +87,9 @@ ...@@ -87,6 +87,9 @@
#ifndef FF_API_CONTEXT_SIZE #ifndef FF_API_CONTEXT_SIZE
#define FF_API_CONTEXT_SIZE (LIBAVUTIL_VERSION_MAJOR < 52) #define FF_API_CONTEXT_SIZE (LIBAVUTIL_VERSION_MAJOR < 52)
#endif #endif
#ifndef FF_API_PIX_FMT_DESC
#define FF_API_PIX_FMT_DESC (LIBAVUTIL_VERSION_MAJOR < 52)
#endif
/** /**
* @} * @}
......
...@@ -82,9 +82,10 @@ static void print_digraph(FILE *outfile, AVFilterGraph *graph) ...@@ -82,9 +82,10 @@ static void print_digraph(FILE *outfile, AVFilterGraph *graph)
link->srcpad->name, link->dstpad->name); link->srcpad->name, link->dstpad->name);
if (link->type == AVMEDIA_TYPE_VIDEO) { if (link->type == AVMEDIA_TYPE_VIDEO) {
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format);
fprintf(outfile, fprintf(outfile,
"fmt:%s w:%d h:%d tb:%d/%d", "fmt:%s w:%d h:%d tb:%d/%d",
av_pix_fmt_descriptors[link->format].name, desc->name,
link->w, link->h, link->w, link->h,
link->time_base.num, link->time_base.den); link->time_base.num, link->time_base.den);
} else if (link->type == AVMEDIA_TYPE_AUDIO) { } else if (link->type == AVMEDIA_TYPE_AUDIO) {
......
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