HANDLE mutex;
HANDLE event;
AVPacketList *pktl;
- AVFormatContext *s;
unsigned int curbufsize;
unsigned int frame_num;
};
dstruct(s, bih, biClrImportant, "lu");
}
-static int shall_we_drop(struct vfw_ctx *ctx)
+static int shall_we_drop(AVFormatContext *s)
{
- AVFormatContext *s = ctx->s;
+ struct vfw_ctx *ctx = s->priv_data;
const uint8_t dropscore[] = {62, 75, 87, 100};
const int ndropscores = FF_ARRAY_ELEMS(dropscore);
unsigned int buffer_fullness = (ctx->curbufsize*100)/s->max_picture_buffer;
if(dropscore[++ctx->frame_num%ndropscores] <= buffer_fullness) {
- av_log(ctx->s, AV_LOG_ERROR,
+ av_log(s, AV_LOG_ERROR,
"real-time buffer %d%% full! frame dropped!\n", buffer_fullness);
return 1;
}
static LRESULT CALLBACK videostream_cb(HWND hwnd, LPVIDEOHDR vdhdr)
{
+ AVFormatContext *s;
struct vfw_ctx *ctx;
AVPacketList **ppktl, *pktl_next;
- ctx = (struct vfw_ctx *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
+ s = (AVFormatContext *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
+ ctx = s->priv_data;
- dump_videohdr(ctx->s, vdhdr);
+ dump_videohdr(s, vdhdr);
- if(shall_we_drop(ctx))
+ if(shall_we_drop(s))
return FALSE;
WaitForSingleObject(ctx->mutex, INFINITE);
static int vfw_read_close(AVFormatContext *s)
{
struct vfw_ctx *ctx = s->priv_data;
+ AVPacketList *pktl;
if(ctx->hwnd) {
SendMessage(ctx->hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
if(ctx->event)
CloseHandle(ctx->event);
+ pktl = ctx->pktl;
+ while (pktl) {
+ AVPacketList *next = pktl->next;
+ av_destruct_packet(&pktl->pkt);
+ av_free(pktl);
+ pktl = next;
+ }
+
return 0;
}
int height;
int ret;
+ if (!strcmp(s->filename, "list")) {
+ for (devnum = 0; devnum <= 9; devnum++) {
+ char driver_name[256];
+ char driver_ver[256];
+ ret = capGetDriverDescription(devnum,
+ driver_name, sizeof(driver_name),
+ driver_ver, sizeof(driver_ver));
+ if (ret) {
+ av_log(s, AV_LOG_INFO, "Driver %d\n", devnum);
+ av_log(s, AV_LOG_INFO, " %s\n", driver_name);
+ av_log(s, AV_LOG_INFO, " %s\n", driver_ver);
+ }
+ }
+ return AVERROR(EIO);
+ }
+
if(!ap->time_base.den) {
av_log(s, AV_LOG_ERROR, "A time base must be specified.\n");
return AVERROR(EIO);
}
- ctx->s = s;
-
ctx->hwnd = capCreateCaptureWindow(NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, 0);
if(!ctx->hwnd) {
av_log(s, AV_LOG_ERROR, "Could not create capture window.\n");
goto fail_io;
}
- SetWindowLongPtr(ctx->hwnd, GWLP_USERDATA, (LONG_PTR) ctx);
+ SetWindowLongPtr(ctx->hwnd, GWLP_USERDATA, (LONG_PTR) s);
st = av_new_stream(s, 0);
if(!st) {
vfw_read_close(s);
- return AVERROR_NOMEM;
+ return AVERROR(ENOMEM);
}
/* Set video format */
bi = av_malloc(bisize);
if(!bi) {
vfw_read_close(s);
- return AVERROR_NOMEM;
+ return AVERROR(ENOMEM);
}
ret = SendMessage(ctx->hwnd, WM_CAP_GET_VIDEOFORMAT, bisize, (LPARAM) bi);
if(!ret)
codec = st->codec;
codec->time_base = ap->time_base;
- codec->codec_type = CODEC_TYPE_VIDEO;
+ codec->codec_type = AVMEDIA_TYPE_VIDEO;
codec->width = width;
codec->height = height;
codec->pix_fmt = vfw_pixfmt(biCompression, biBitCount);
codec->bits_per_coded_sample = biBitCount;
} else {
codec->codec_id = CODEC_ID_RAWVIDEO;
- if(biCompression == BI_RGB)
+ if(biCompression == BI_RGB) {
codec->bits_per_coded_sample = biBitCount;
+ codec->extradata = av_malloc(9 + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (codec->extradata) {
+ codec->extradata_size = 9;
+ memcpy(codec->extradata, "BottomUp", 9);
+ }
+ }
}
av_set_pts_info(st, 32, 1, 1000);