659 lines · 20.8 KB · C++
RawDownload
        case 2:        case 8:        case 16:            break;        default:            av_log(avctx, AV_LOG_ERROR, "Value of channels option must be one of 2, 8 or 16\n");            return AVERROR(EINVAL);    }     /* List available devices. */    if (ctx->list_devices) {        ff_decklink_list_devices(avctx);        return AVERROR_EXIT;    }     strcpy (fname, avctx->filename);    tmp=strchr (fname, '@');    if (tmp != NULL) {        mode_num = atoi (tmp+1);        *tmp = 0;    }     ret = ff_decklink_init_device(avctx, fname);    if (ret < 0)        return ret;     /* Get input device. */    if (ctx->dl->QueryInterface(IID_IDeckLinkInput, (void **) &ctx->dli) != S_OK) {        av_log(avctx, AV_LOG_ERROR, "Could not open input device from '%s'\n",               avctx->filename);        ret = AVERROR(EIO);        goto error;    }     /* List supported formats. */    if (ctx->list_formats) {        ff_decklink_list_formats(avctx, DIRECTION_IN);        ret = AVERROR_EXIT;        goto error;    }     if (mode_num > 0) {        if (ff_decklink_set_format(avctx, DIRECTION_IN, mode_num) < 0) {            av_log(avctx, AV_LOG_ERROR, "Could not set mode %d for %s\n", mode_num, fname);            ret = AVERROR(EIO);            goto error;        }    }     /* Setup streams. */    st = avformat_new_stream(avctx, NULL);    if (!st) {        av_log(avctx, AV_LOG_ERROR, "Cannot add stream\n");        ret = AVERROR(ENOMEM);        goto error;    }    st->codecpar->codec_type  = AVMEDIA_TYPE_AUDIO;    st->codecpar->codec_id    = AV_CODEC_ID_PCM_S16LE;    st->codecpar->sample_rate = bmdAudioSampleRate48kHz;    st->codecpar->channels    = cctx->audio_channels;    avpriv_set_pts_info(st, 64, 1, 1000000);  /* 64 bits pts in us */    ctx->audio_st=st;     st = avformat_new_stream(avctx, NULL);    if (!st) {        av_log(avctx, AV_LOG_ERROR, "Cannot add stream\n");        ret = AVERROR(ENOMEM);        goto error;    }    st->codecpar->codec_type  = AVMEDIA_TYPE_VIDEO;    st->codecpar->width       = ctx->bmd_width;    st->codecpar->height      = ctx->bmd_height;     st->time_base.den      = ctx->bmd_tb_den;    st->time_base.num      = ctx->bmd_tb_num;    av_stream_set_r_frame_rate(st, av_make_q(st->time_base.den, st->time_base.num));     if (cctx->v210) {        st->codecpar->codec_id    = AV_CODEC_ID_V210;        st->codecpar->codec_tag   = MKTAG('V', '2', '1', '0');        st->codecpar->bit_rate    = av_rescale(ctx->bmd_width * ctx->bmd_height * 64, st->time_base.den, st->time_base.num * 3);    } else {        st->codecpar->codec_id    = AV_CODEC_ID_RAWVIDEO;        st->codecpar->format      = AV_PIX_FMT_UYVY422;        st->codecpar->codec_tag   = MKTAG('U', 'Y', 'V', 'Y');        st->codecpar->bit_rate    = av_rescale(ctx->bmd_width * ctx->bmd_height * 16, st->time_base.den, st->time_base.num);    }     avpriv_set_pts_info(st, 64, 1, 1000000);  /* 64 bits pts in us */     ctx->video_st=st;     if (ctx->teletext_lines) {        st = avformat_new_stream(avctx, NULL);        if (!st) {            av_log(avctx, AV_LOG_ERROR, "Cannot add stream\n");            ret = AVERROR(ENOMEM);            goto error;        }        st->codecpar->codec_type  = AVMEDIA_TYPE_SUBTITLE;        st->time_base.den         = ctx->bmd_tb_den;        st->time_base.num         = ctx->bmd_tb_num;        st->codecpar->codec_id    = AV_CODEC_ID_DVB_TELETEXT;        avpriv_set_pts_info(st, 64, 1, 1000000);  /* 64 bits pts in us */        ctx->teletext_st = st;    }     av_log(avctx, AV_LOG_VERBOSE, "Using %d input audio channels\n", ctx->audio_st->codecpar->channels);    result = ctx->dli->EnableAudioInput(bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger, ctx->audio_st->codecpar->channels);     if (result != S_OK) {        av_log(avctx, AV_LOG_ERROR, "Cannot enable audio input\n");        ret = AVERROR(EIO);        goto error;    }     result = ctx->dli->EnableVideoInput(ctx->bmd_mode,                                        cctx->v210 ? bmdFormat10BitYUV : bmdFormat8BitYUV,                                        bmdVideoInputFlagDefault);     if (result != S_OK) {        av_log(avctx, AV_LOG_ERROR, "Cannot enable video input\n");        ret = AVERROR(EIO);        goto error;    }     avpacket_queue_init (avctx, &ctx->queue);     if (decklink_start_input (avctx) != S_OK) {        av_log(avctx, AV_LOG_ERROR, "Cannot start input stream\n");        ret = AVERROR(EIO);        goto error;    }     return 0; error:    ff_decklink_cleanup(avctx);    return ret;} int ff_decklink_read_packet(AVFormatContext *avctx, AVPacket *pkt){    struct decklink_cctx *cctx = (struct decklink_cctx *)avctx->priv_data;    struct decklink_ctx *ctx = (struct decklink_ctx *)cctx->ctx;    AVFrame *frame = ctx->video_st->codec->coded_frame;     avpacket_queue_get(&ctx->queue, pkt, 1);    if (frame && (ctx->bmd_field_dominance == bmdUpperFieldFirst || ctx->bmd_field_dominance == bmdLowerFieldFirst)) {        frame->interlaced_frame = 1;        if (ctx->bmd_field_dominance == bmdUpperFieldFirst) {            frame->top_field_first = 1;        }    }     return 0;} } /* extern "C" */

Lines 501–659 of 659. Previous lines

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t