<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small">The previous code had some mistakes which lead to build error.</div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small">I correct it:</div><div class="gmail_default"><div class="gmail_default"><font face="tahoma, sans-serif">int CplayerDlg::play()</font></div><div class="gmail_default"><font face="tahoma, sans-serif">{</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>FILE *fp = fopen("video_files/1010.brf", "rb");</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(fp);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><br></font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>RecordFrame rf;</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>RecordHeader hdr;</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(fread(&rf, sizeof(rf), 1, fp) == 1);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(rf.frameType == FRAME_TYPE_HEADER);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(fread(&hdr, sizeof(hdr), 1, fp) == 1);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>GetDlgItem(IDC_DIM)->SetWindowText(format("%dx%d", hdr.width, hdr.height));</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>GetDlgItem(IDC_CODEC_ID)->SetWindowText(format("%d", hdr.codecId));</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>GetDlgItem(IDC_PIXEL_FORMAT)->SetWindowText(format("%d", hdr.pixelFormat));</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>GetDlgItem(IDC_TIMEBASE)->SetWindowText(format("%d/%d", hdr.timebaseNum, hdr.timebaseDen));</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><br></font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>AVHWDeviceType type = av_hwdevice_find_type_by_name("dxva2");</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(type != AV_HWDEVICE_TYPE_NONE);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>AVCodec *decoder = avcodec_find_decoder(AV_CODEC_ID_H264);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(decoder);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>for (int i = 0;; i++)</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>{</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>const AVCodecHWConfig *config = avcodec_get_hw_config(decoder, i);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(config);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX &&</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>config->device_type == type)</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>{</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>hw_pix_fmt = config->pix_fmt;</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>break;</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>}</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>}</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>AVCodecContext *decoder_ctx = avcodec_alloc_context3(decoder);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(decoder_ctx);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>decoder_ctx->get_format = get_hw_format;</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(!av_hwdevice_ctx_create(&hw_device_ctx, type, NULL, NULL, 0));</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>decoder_ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(!avcodec_open2(decoder_ctx, decoder, NULL));</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>AVPacket packet;</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>av_init_packet(&packet);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>char buf[100000];</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>AVFrame *frame = av_frame_alloc();</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(frame);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>while (true)</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>{</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(fread(&rf, sizeof(rf), 1, fp) == 1);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(rf.frameType == FRAME_TYPE_STREAM);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(fread(buf, rf.frameSize, 1, fp) == 1);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>packet.data = (uint8_t *) buf;</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>packet.size = rf.frameSize;</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>packet.flags = rf.flags;</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>packet.dts = packet.pts = rf.timestamp;</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(!avcodec_send_packet(decoder_ctx, &packet));</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>ASSERT(!avcodec_receive_frame(decoder_ctx, frame));</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>}</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>fclose(fp);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>av_frame_free(&frame);</font></div><div class="gmail_default"><font face="tahoma, sans-serif"><span style="white-space:pre"> </span>return 0;</font></div><div class="gmail_default"><font face="tahoma, sans-serif">}</font></div><div style="font-family:tahoma,sans-serif;font-size:small"><br></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Feb 18, 2019 at 9:30 PM hamidi <<a href="mailto:hamidi@gmail.com">hamidi@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small">In the following code:<br></div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small"><pre><code>int CplayerDlg::play()
{
FILE *fp = fopen("video_files/1010.brf", "rb");
ASSERT(fp);
RecordFrame rf;
RecordHeader hdr;
ASSERT(fread(&rf, sizeof(rf), 1, fp) == 1);
ASSERT(rf.frameType == FRAME_TYPE_HEADER);
ASSERT(fread(&hdr, sizeof(hdr), 1, fp) == 1);
GetDlgItem(IDC_DIM)->SetWindowText(format("%dx%d", hdr.width, hdr.height));
GetDlgItem(IDC_CODEC_ID)->SetWindowText(format("%d", hdr.codecId));
GetDlgItem(IDC_PIXEL_FORMAT)->SetWindowText(format("%d", hdr.pixelFormat));
GetDlgItem(IDC_TIMEBASE)->SetWindowText(format("%d/%d", hdr.timebaseNum, hdr.timebaseDen));
AVHWDeviceType type = av_hwdevice_find_type_by_name("dxva2");
ASSERT(type != AV_HWDEVICE_TYPE_NONE);
AVCodec *decoder = avcodec_find_decoder(AV_CODEC_ID_H264);
ASSERT(decoder);
for (int i = 0;; i++)
{
const AVCodecHWConfig *config = avcodec_get_hw_config(decoder, i);
ASSERT(config);
if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX &&
config->device_type == type)
{
hw_pix_fmt = config->pix_fmt;
break;
}
}
AVCodecContext *decoder_ctx = avcodec_alloc_context3(decoder);
ASSERT(decoder_ctx);
decoder_ctx->get_format = get_hw_format;
ASSERT(!av_hwdevice_ctx_create(&hw_device_ctx, type, NULL, NULL, 0));
ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx);
ASSERT(!avcodec_open2(decoder_ctx, decoder, NULL));
AVPacket packet;
av_init_packet(&packet);
char buf[100000];
AVFrame *frame = av_frame_alloc();
ASSERT(frame);
while (true)
{
ASSERT(fread(&rf, sizeof(rf), 1, fp) == 1);
ASSERT(rf.frameType == FRAME_TYPE_STREAM);
ASSERT(fread(buf, rf.frameSize, 1, fp) == 1);
packet.data = (uint8_t *) buf;
packet.size = rf.frameSize;
packet.flags = rf.flags;
packet.dts = packet.pts = rf.timestamp;
ASSERT(!avcodec_send_packet(decoder_ctx, &packet));
ASSERT(!avcodec_receive_frame(decoder_ctx, frame));
}
fclose(fp);
av_frame_free(&packet);
return 0;
}</code></pre><pre><code>I get error -22 in avcodec_send_packet. The format of the file is
custom, but the format of frames is the same as what I've got previously
from an IP camera (H264). I inspired the code from hw_decode.c from
ffmpeg sources. What I've missed?<br></code></pre></div></div>
</blockquote></div>