mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-04 06:08:26 +02:00
dshow: miscellaneous tweaks
Signed-off-by: rogerdpack <rogerpack2005@gmail.com>
This commit is contained in:
parent
d01234419b
commit
e620eee88c
@ -188,10 +188,12 @@ static int shall_we_drop(AVFormatContext *s, int index, enum dshowDeviceType dev
|
|||||||
static const uint8_t dropscore[] = {62, 75, 87, 100};
|
static const uint8_t dropscore[] = {62, 75, 87, 100};
|
||||||
const int ndropscores = FF_ARRAY_ELEMS(dropscore);
|
const int ndropscores = FF_ARRAY_ELEMS(dropscore);
|
||||||
unsigned int buffer_fullness = (ctx->curbufsize[index]*100)/s->max_picture_buffer;
|
unsigned int buffer_fullness = (ctx->curbufsize[index]*100)/s->max_picture_buffer;
|
||||||
|
const char *devtypename = (devtype == VideoDevice) ? "video" : "audio";
|
||||||
|
|
||||||
if(dropscore[++ctx->video_frame_num%ndropscores] <= buffer_fullness) {
|
if(dropscore[++ctx->video_frame_num%ndropscores] <= buffer_fullness) {
|
||||||
av_log(s, AV_LOG_ERROR,
|
av_log(s, AV_LOG_ERROR,
|
||||||
"real-time buffer[%s] too full (%d%% of size: %d)! frame dropped!\n", ctx->device_name[devtype], buffer_fullness, s->max_picture_buffer);
|
"real-time buffer [%s] [%s input] too full or near too full (%d%% of size: %d [rtbufsize parameter])! frame dropped!\n",
|
||||||
|
ctx->device_name[devtype], devtypename, buffer_fullness, s->max_picture_buffer);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,7 +368,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype,
|
|||||||
AM_MEDIA_TYPE *type = NULL;
|
AM_MEDIA_TYPE *type = NULL;
|
||||||
int format_set = 0;
|
int format_set = 0;
|
||||||
void *caps = NULL;
|
void *caps = NULL;
|
||||||
int i, n, size;
|
int i, n, size, r;
|
||||||
|
|
||||||
if (IPin_QueryInterface(pin, &IID_IAMStreamConfig, (void **) &config) != S_OK)
|
if (IPin_QueryInterface(pin, &IID_IAMStreamConfig, (void **) &config) != S_OK)
|
||||||
return;
|
return;
|
||||||
@ -378,8 +380,9 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype,
|
|||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
for (i = 0; i < n && !format_set; i++) {
|
for (i = 0; i < n && !format_set; i++) {
|
||||||
IAMStreamConfig_GetStreamCaps(config, i, &type, (void *) caps);
|
r = IAMStreamConfig_GetStreamCaps(config, i, &type, (void *) caps);
|
||||||
|
if (r != S_OK)
|
||||||
|
goto next;
|
||||||
#if DSHOWDEBUG
|
#if DSHOWDEBUG
|
||||||
ff_print_AM_MEDIA_TYPE(type);
|
ff_print_AM_MEDIA_TYPE(type);
|
||||||
#endif
|
#endif
|
||||||
@ -643,6 +646,7 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype,
|
|||||||
goto next;
|
goto next;
|
||||||
|
|
||||||
IEnumMediaTypes_Reset(types);
|
IEnumMediaTypes_Reset(types);
|
||||||
|
/* in case format_set was not called, just verify the majortype */
|
||||||
while (!device_pin && IEnumMediaTypes_Next(types, 1, &type, NULL) == S_OK) {
|
while (!device_pin && IEnumMediaTypes_Next(types, 1, &type, NULL) == S_OK) {
|
||||||
if (IsEqualGUID(&type->majortype, mediatype[devtype])) {
|
if (IsEqualGUID(&type->majortype, mediatype[devtype])) {
|
||||||
device_pin = pin;
|
device_pin = pin;
|
||||||
@ -663,7 +667,6 @@ next:
|
|||||||
av_free(pin_buf);
|
av_free(pin_buf);
|
||||||
if (pin_id)
|
if (pin_id)
|
||||||
CoTaskMemFree(pin_id);
|
CoTaskMemFree(pin_id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumPins_Release(pins);
|
IEnumPins_Release(pins);
|
||||||
|
@ -223,7 +223,7 @@ libAVEnumPins *libAVEnumPins_Create (libAVPin *pin, libAVFilter *filter);
|
|||||||
* libAVEnumMediaTypes
|
* libAVEnumMediaTypes
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
struct libAVEnumMediaTypes {
|
struct libAVEnumMediaTypes {
|
||||||
IEnumPinsVtbl *vtbl;
|
IEnumMediaTypesVtbl *vtbl;
|
||||||
long ref;
|
long ref;
|
||||||
int pos;
|
int pos;
|
||||||
AM_MEDIA_TYPE type;
|
AM_MEDIA_TYPE type;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user