10 #include <sys/types.h>
13 #include <QStringList>
35 #ifndef MYTHTV_BSWAP_H
36 #define MYTHTV_BSWAP_H
40 #define bswap_dbl(x) bswap_64(x)
43 # include <byteswap.h>
44 #elif HAVE_SYS_ENDIAN_H
45 # include <sys/endian.h>
46 # if !defined(bswap_16) && defined(bswap16)
47 # define bswap_16(x) bswap16(x)
49 # if !defined(bswap_32) && defined(bswap32)
50 # define bswap_32(x) bswap32(x)
52 # if !defined(bswap_64) && defined(bswap64)
53 # define bswap_64(x) bswap64(x)
56 # include <libkern/OSByteOrder.h>
57 # define bswap_16(x) OSSwapInt16(x)
58 # define bswap_32(x) OSSwapInt32(x)
59 # define bswap_64(x) OSSwapInt64(x)
61 # error Byte swapping functions not defined for this platform
69 #include "libswscale/swscale.h"
70 #include "libavutil/imgutils.h"
74 #include <linux/videodev2.h>
81 #define LOC QString("NVR(%1): ").arg(m_videodevice)
101 m_seekTable =
new std::vector<struct seektable_entry>;
166 else if (opt ==
"height")
168 else if (opt ==
"rtjpegchromafilter")
170 else if (opt ==
"rtjpeglumafilter")
172 else if (opt ==
"rtjpegquality")
174 else if ((opt ==
"mpeg4bitrate") || (opt ==
"mpeg2bitrate"))
176 else if (opt ==
"scalebitrate")
178 else if (opt ==
"mpeg4maxquality")
185 else if (opt ==
"mpeg4minquality")
187 else if (opt ==
"mpeg4qualdiff")
189 else if (opt ==
"encodingthreadcount")
191 else if (opt ==
"mpeg4optionvhq")
198 else if (opt ==
"mpeg4option4mv")
205 else if (opt ==
"mpeg4optionidct")
208 m_mp4Opts |= AV_CODEC_FLAG_INTERLACED_DCT;
210 m_mp4Opts &= ~AV_CODEC_FLAG_INTERLACED_DCT;
212 else if (opt ==
"mpeg4optionime")
215 m_mp4Opts |= AV_CODEC_FLAG_INTERLACED_ME;
217 m_mp4Opts &= ~AV_CODEC_FLAG_INTERLACED_ME;
219 else if (opt ==
"hardwaremjpegquality")
221 else if (opt ==
"hardwaremjpeghdecimation")
223 else if (opt ==
"hardwaremjpegvdecimation")
225 else if (opt ==
"audiocompression")
227 else if (opt ==
"mp3quality")
229 else if (opt ==
"samplerate")
231 else if (opt ==
"audioframesize")
233 else if (opt ==
"pip_mode")
235 else if (opt ==
"inpixfmt")
237 else if (opt ==
"skipbtaudio")
239 else if (opt ==
"volume")
251 const QString &videodev,
252 const QString &audiodev,
253 const QString &vbidev)
264 setting =
tmp->getValue();
266 if (setting ==
"MPEG-4")
275 #ifdef USING_FFMPEG_THREADS
283 else if (setting ==
"MPEG-2")
289 #ifdef USING_FFMPEG_THREADS
293 else if (setting ==
"RTjpeg")
301 else if (setting ==
"Hardware MJPEG")
303 SetOption(
"videocodec",
"hardware-mjpeg");
311 LOG(VB_GENERAL, LOG_ERR,
LOC +
312 "Unknown video codec. "
313 "Please go into the TV Settings, Recording Profiles and "
314 "setup the four 'Software Encoders' profiles. "
315 "Assuming RTjpeg for now.");
327 setting =
tmp->getValue();
329 if (setting ==
"MP3")
335 else if (setting ==
"Uncompressed")
342 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Unknown audio codec");
402 m_mpaVidCodec = avcodec_find_encoder_by_name(vcodec.constData());
406 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Video Codec not found: %1")
407 .arg(vcodec.constData()));
415 case AV_PIX_FMT_YUV420P:
416 case AV_PIX_FMT_YUV422P:
417 case AV_PIX_FMT_YUVJ420P:
421 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Unknown picture format: %1")
432 usebitrate = (int)(diff * usebitrate);
459 AVDictionary *
opts =
nullptr;
462 m_mpaVidCtx->bit_rate_tolerance = usebitrate * 100;
472 av_dict_set(&
opts,
"rc_strategy",
"2", 0);
473 av_dict_set(&
opts,
"b_strategy",
"0", 0);
479 av_dict_set(&
opts,
"rc_init_cplx",
"0", 0);
483 m_mpaVidCtx->strict_std_compliance = FF_COMPLIANCE_UNOFFICIAL;
488 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Unable to open FFMPEG/%1 codec")
515 double aspectnum =
m_wOut / (double)tot_height;
518 if (aspectnum == 0.0)
520 else if (fabs(aspectnum - 1.3333333333333333) < 0.001)
522 else if (fabs(aspectnum - 1.7777777777777777) < 0.001)
524 else if (fabs(aspectnum - 2.21) < 0.001)
527 aspect = aspectnum * 1000000;
535 if (
m_wOut && tot_height &&
551 case 2398: den = 24000;
555 case 2998: den = 30000;
559 case 5995: den = 60000;
568 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"NVR: frame rate = %1")
578 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to init audio input device");
612 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Warning, old RingBuffer creation");
618 m_error =
"Could not open RingBuffer";
638 LOG(VB_GENERAL, LOG_ERR,
LOC +
645 LOG(VB_GENERAL, LOG_ERR,
LOC +
654 LOG(VB_GENERAL, LOG_ERR,
LOC +
655 QString(
"Failed to determine audio block size on %1,"
664 LOG(VB_AUDIO, LOG_INFO,
LOC +
665 QString(
"Audio device %1 buffer size: %1 bytes")
671 lame_set_bWriteVbrTag(
m_gf, 0);
673 lame_set_compression_ratio(
m_gf, 11);
677 int tmp = lame_init_params(
m_gf);
680 LOG(VB_GENERAL, LOG_ERR,
LOC +
681 QString(
"AudioInit(): lame_init_params error %1").arg(
tmp));
687 LOG(VB_GENERAL, LOG_ERR,
LOC +
688 "AudioInit(): lame support requires 16bit audio");
709 LOG(VB_GENERAL, LOG_ERR,
LOC +
"MJPEG not supported by device");
745 vidbuf->freeToEncode = 0;
746 vidbuf->freeToBuffer = 1;
747 vidbuf->bufferlen = 0;
748 vidbuf->forcekey =
false;
758 audbuf->freeToEncode = 0;
759 audbuf->freeToBuffer = 1;
768 txtbuf->freeToEncode = 0;
769 txtbuf->freeToBuffer = 1;
779 delete [] (vidbuf->buffer);
797 m_fd = open(vdevice.constData(), O_RDWR);
801 m_fd = open(vdevice.constData(), O_RDWR);
820 struct v4l2_capability vcap {};
822 if (ioctl(
m_channelFd, VIDIOC_QUERYCAP, &vcap) < 0)
827 if (
m_usingV4l2 && !(vcap.capabilities & V4L2_CAP_VIDEO_CAPTURE))
829 LOG(VB_GENERAL, LOG_ERR,
LOC +
830 "Not a v4l2 capture device, falling back to v4l");
834 if (
m_usingV4l2 && !(vcap.capabilities & V4L2_CAP_STREAMING))
836 LOG(VB_GENERAL, LOG_ERR,
LOC +
837 "Won't work with the streaming interface, falling back");
841 if (vcap.card[0] ==
'B' && vcap.card[1] ==
'T' &&
842 vcap.card[2] ==
'8' && vcap.card[4] ==
'8')
845 QString driver = (
char *)vcap.driver;
846 if (driver ==
"go7007")
853 if (lzo_init() != LZO_E_OK)
855 LOG(VB_GENERAL, LOG_ERR,
LOC +
"lzo_init() failed, exiting");
856 m_error =
"lzo_init() failed, exiting";
863 m_error =
"Failed to open device";
872 m_error =
"Failed to set V4L2 format";
895 m_error = QString(
"Cannot open '%1' for writing")
903 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Children are already alive");
904 m_error =
"Children are already alive";
926 gettimeofday(&
m_stm,
nullptr);
949 struct v4l2_format vfmt {};
951 vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
955 vfmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
958 vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
960 vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV422P;
962 vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
964 if (ioctl(
m_fd, VIDIOC_S_FMT, &vfmt) < 0)
967 vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
969 if (ioctl(
m_fd, VIDIOC_S_FMT, &vfmt) < 0)
972 vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
973 if (ioctl(
m_fd, VIDIOC_S_FMT, &vfmt) < 0)
975 LOG(VB_GENERAL, LOG_ERR,
LOC +
976 "v4l2: Unable to set desired format");
984 LOG(VB_GENERAL, LOG_ERR,
LOC +
985 "v4l2: uyvy format supported, but yuv422 requested.");
986 LOG(VB_GENERAL, LOG_ERR,
LOC +
987 "v4l2: unfortunately, this converter hasn't been "
988 "written yet, exiting");
991 LOG(VB_RECORD, LOG_INFO,
LOC +
992 "v4l2: format set, getting uyvy from v4l, converting");
999 LOG(VB_GENERAL, LOG_ERR,
LOC +
1000 "v4l2: yuyv format supported, but yuv422 requested.");
1001 LOG(VB_GENERAL, LOG_ERR,
LOC +
1002 "v4l2: unfortunately, this converter hasn't been written "
1006 LOG(VB_RECORD, LOG_INFO,
LOC +
1007 "v4l2: format set, getting yuyv from v4l, converting");
1011 LOG(VB_RECORD, LOG_INFO,
LOC +
1012 "v4l2: format set, getting yuv420 from v4l");
1015 if (
m_width != (
int)vfmt.fmt.pix.width ||
1016 m_height != (
int)vfmt.fmt.pix.height)
1018 LOG(VB_RECORD, LOG_INFO,
LOC +
1019 QString(
"v4l2: resolution changed. requested %1x%2, using "
1022 .arg(vfmt.fmt.pix.width) .arg(vfmt.fmt.pix.height));
1031 #else // if !USING_V4L2
1033 #endif // !USING_V4L2
1039 struct v4l2_buffer vbuf {};
1040 struct v4l2_requestbuffers vrbuf {};
1041 struct v4l2_control vc {};
1043 vc.id = V4L2_CID_AUDIO_MUTE;
1046 if (ioctl(
m_fd, VIDIOC_S_CTRL, &vc) < 0)
1047 LOG(VB_GENERAL, LOG_ERR,
LOC +
1048 "VIDIOC_S_CTRL:V4L2_CID_AUDIO_MUTE: " +
ENO);
1080 m_error =
"Unable to set compression params";
1092 m_error =
"Unable to set MPEG params";
1101 usebitrate = (int)(diff * usebitrate);
1106 m_error =
"Unable to set bitrate";
1116 vrbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1117 vrbuf.memory = V4L2_MEMORY_MMAP;
1118 vrbuf.count = numbuffers;
1120 if (ioctl(
m_fd, VIDIOC_REQBUFS, &vrbuf) < 0)
1122 m_error =
"Not able to get any capture buffers, exiting";
1127 if (vrbuf.count < numbuffers)
1129 LOG(VB_GENERAL, LOG_INFO,
LOC +
1130 QString(
"Requested %1 buffers, but only %2 are available. "
1131 "Proceeding anyway").arg(numbuffers).arg(vrbuf.count));
1134 numbuffers = vrbuf.count;
1136 std::array<uint8_t*,MAX_VIDEO_BUFFERS>
buffers {};
1137 std::array<int,MAX_VIDEO_BUFFERS> bufferlen {};
1139 for (
uint i = 0; i < numbuffers; i++)
1141 vbuf.type = vrbuf.type;
1144 if (ioctl(
m_fd, VIDIOC_QUERYBUF, &vbuf) < 0)
1146 LOG(VB_GENERAL, LOG_ERR,
LOC +
1147 QString(
"unable to query capture buffer %1").arg(i));
1148 m_error =
"Unable to query capture buffer";
1152 buffers[i] = (
unsigned char *)mmap(
nullptr, vbuf.length,
1153 PROT_READ|PROT_WRITE, MAP_SHARED,
1154 m_fd, vbuf.m.offset);
1158 LOG(VB_GENERAL, LOG_ERR,
LOC +
"mmap: " +
ENO);
1159 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Memory map failed");
1160 m_error =
"Memory map failed";
1163 bufferlen[i] = vbuf.length;
1166 for (
uint i = 0; i < numbuffers; i++)
1168 memset(
buffers[i], 0, bufferlen[i]);
1169 vbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1171 if (ioctl(
m_fd, VIDIOC_QBUF, &vbuf) < 0)
1172 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to enqueue capture buffer (VIDIOC_QBUF failed) " +
ENO);
1175 int turnon = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1176 if (ioctl(
m_fd, VIDIOC_STREAMON, &turnon) < 0)
1177 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to start capture (VIDIOC_STREAMON failed) " +
ENO);
1179 struct timeval tv {};
1182 bool forcekey =
false;
1187 uint8_t *output_buffer =
nullptr;
1188 struct SwsContext *convert_ctx =
nullptr;
1194 AV_PIX_FMT_YUYV422 :
1200 m_error =
"Cannot initialize image conversion buffer";
1205 convert_ctx = sws_getCachedContext(convert_ctx,
m_width,
m_height, in_pixfmt,
1207 SWS_FAST_BILINEAR,
nullptr,
nullptr,
nullptr);
1210 m_error =
"Cannot initialize image conversion context";
1211 av_free(output_buffer);
1216 av_image_fill_arrays(img_out.data, img_out.linesize,
1236 gettimeofday(&
m_stm,
nullptr);
1249 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Resetting and re-queueing");
1250 turnon = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1251 if (ioctl(
m_fd, VIDIOC_STREAMOFF, &turnon) < 0)
1252 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to stop capture (VIDIOC_STREAMOFF failed) " +
ENO);
1254 for (
uint i = 0; i < numbuffers; i++)
1256 memset(
buffers[i], 0, bufferlen[i]);
1257 vbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1259 if (ioctl(
m_fd, VIDIOC_QBUF, &vbuf) < 0)
1260 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to enqueue capture buffer (VIDIOC_QBUF failed) " +
ENO);
1263 if (ioctl(
m_fd, VIDIOC_STREAMON, &turnon) < 0)
1264 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to start capture (VIDIOC_STREAMON failed) " +
ENO);
1271 FD_SET(
m_fd, &rdset);
1273 switch (select(
m_fd+1, &rdset,
nullptr,
nullptr, &tv))
1278 LOG(VB_GENERAL, LOG_ERR,
LOC +
"select: " +
ENO);
1281 LOG(VB_GENERAL, LOG_INFO,
LOC +
"select timeout");
1286 memset(&vbuf, 0,
sizeof(vbuf));
1287 vbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1288 vbuf.memory = V4L2_MEMORY_MMAP;
1289 if (ioctl(
m_fd, VIDIOC_DQBUF, &vbuf) < 0)
1291 LOG(VB_GENERAL, LOG_ERR,
LOC +
"DQBUF ioctl failed." +
ENO);
1302 if (errno == EIO || errno == EINVAL)
1308 if (errno == EAGAIN)
1314 forcekey = ((vbuf.flags & V4L2_BUF_FLAG_KEYFRAME) != 0U);
1319 (output_buffer !=
nullptr))
1322 av_image_fill_arrays(img_in.data, img_in.linesize,
1325 sws_scale(convert_ctx, img_in.data, img_in.linesize,
1326 0,
m_height, img_out.data, img_out.linesize);
1330 (output_buffer !=
nullptr))
1333 av_image_fill_arrays(img_in.data, img_in.linesize,
1336 sws_scale(convert_ctx, img_in.data, img_in.linesize,
1337 0,
m_height, img_out.data, img_out.linesize);
1347 vbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1348 if (ioctl(
m_fd, VIDIOC_QBUF, &vbuf) < 0)
1349 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to enqueue capture buffer (VIDIOC_QBUF failed) " +
ENO);
1354 if (ioctl(
m_fd, VIDIOC_STREAMOFF, &turnon) < 0)
1355 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to stop capture (VIDIOC_STREAMOFF failed) " +
ENO);
1357 for (
uint i = 0; i < numbuffers; i++)
1359 munmap(
buffers[i], bufferlen[i]);
1364 av_free(output_buffer);
1365 sws_freeContext(convert_ctx);
1370 #else // if !USING_V4L2
1372 #endif // !USING_V4L2
1407 struct timeval now {};
1415 gettimeofday(&now,
nullptr);
1417 auto tcres = durationFromTimevalDelta<std::chrono::milliseconds>(now,
m_stm);
1427 int fn = (tcres -
m_oldTc).count();
1446 LOG(VB_GENERAL, LOG_INFO,
LOC +
1447 "DROPPED frame due to full buffer in the recorder.");
1499 static const std::string kFinfo {
"MythTVVideo" };
1500 static const std::string kVers {
"0.07" };
1518 fileheader.
width = bswap_32(fileheader.
width);
1523 fileheader.
fps = bswap_dbl(fileheader.
fps);
1550 static std::array<uint32_t,128> s_tbls {};
1553 frameheader.
packetlength = s_tbls.size() *
sizeof(uint32_t);
1561 memset(&frameheader, 0,
sizeof(frameheader));
1576 case AV_CODEC_ID_MPEG4: vidfcc =
FOURCC_DIVX;
break;
1577 case AV_CODEC_ID_WMV1: vidfcc =
FOURCC_WMV1;
break;
1578 case AV_CODEC_ID_MSMPEG4V3: vidfcc =
FOURCC_DIV3;
break;
1579 case AV_CODEC_ID_MSMPEG4V2: vidfcc =
FOURCC_MP42;
break;
1580 case AV_CODEC_ID_MSMPEG4V1: vidfcc =
FOURCC_MPG4;
break;
1581 case AV_CODEC_ID_MJPEG: vidfcc =
FOURCC_MJPG;
break;
1582 case AV_CODEC_ID_H263:
1583 case AV_CODEC_ID_H263P: vidfcc =
FOURCC_H263;
break;
1584 case AV_CODEC_ID_H263I: vidfcc =
FOURCC_I263;
break;
1585 case AV_CODEC_ID_MPEG1VIDEO: vidfcc =
FOURCC_MPEG;
break;
1586 case AV_CODEC_ID_MPEG2VIDEO: vidfcc =
FOURCC_MPG2;
break;
1587 case AV_CODEC_ID_HUFFYUV: vidfcc =
FOURCC_HFYU;
break;
1664 memcpy(seekbuf + offset, (
const void *)&entry,
1683 const std::vector<struct kfatable_entry> &kfa_table)
1685 int numentries = kfa_table.size();
1698 for (
const auto& kfa : kfa_table)
1700 memcpy(kfa_buf + offset, &kfa,
1741 LOG(VB_GENERAL, LOG_ERR,
LOC +
1742 "No ringbuffer, recorder wasn't initialized.");
1748 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Ringbuffer isn't open");
1809 LOG(VB_GENERAL, LOG_ERR,
LOC +
1816 LOG(VB_GENERAL, LOG_ERR,
LOC +
1823 LOG(VB_GENERAL, LOG_ERR,
LOC +
1828 struct timeval anow {};
1862 LOG(VB_GENERAL, LOG_ERR,
LOC +
1863 QString(
"Short read, %1 of %2 bytes from ")
1871 gettimeofday(&anow,
nullptr);
1878 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Ran out of free AUDIO buffers :-(");
1888 durationFromTimevalDelta<std::chrono::milliseconds>(anow,
m_stm);
1916 struct timeval tnow {};
1917 gettimeofday(&tnow,
nullptr);
1922 LOG(VB_GENERAL, LOG_ERR,
LOC +
1923 QString(
"Teletext #%1: ran out of free TEXT buffers :-(").arg(act));
1930 durationFromTimevalDelta<std::chrono::milliseconds>(tnow,
m_stm);
1938 std::vector<uint8_t> linebuf {};
2024 if ((c & 0xa0) == 0x20)
2027 c += (c & 0x40) ? 32 : -32;
2033 if (visible || (c !=
' '))
2044 linebuf.push_back(c);
2053 st.len = linebuf.size() + 1;
2055 int bufsize = ((outpos - m_textBuffer[act]->buffer + 1) + st.len);
2056 if (bufsize > maxlen)
2058 memcpy(outpos, &st,
sizeof(st));
2059 outpos +=
sizeof(st);
2060 int count = std::max(st.len,
static_cast<uint8_t
>(41));
2061 std::copy(linebuf.cbegin(), linebuf.cbegin() + count, outpos);
2067 m_textBuffer[act]->bufferlen = outpos - m_textBuffer[act]->buffer + 1;
2068 m_textBuffer[act]->freeToBuffer = 0;
2070 if (m_actTextBuffer >= m_textBufferCount)
2071 m_actTextBuffer = 0;
2072 m_textBuffer[act]->freeToEncode = 1;
2076 #endif // USING_V4L2
2080 struct timeval tnow {};
2081 gettimeofday (&tnow,
nullptr);
2085 auto tc = durationFromTimevalDelta<std::chrono::milliseconds>(tnow,
m_stm);
2090 std::chrono::milliseconds timecode,
char )
2095 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Teletext#%1").arg(act) +
2096 " ran out of free TEXT buffers :-(");
2148 std::chrono::milliseconds firsttimecode = -1ms;
2158 (
action == ACTION_NONE ||
2167 (
action == ACTION_NONE ||
2202 LOG(VB_GENERAL, LOG_ERR,
LOC +
2203 "ACTION_AUDIO cannot be completed due to error.");
2283 std::array<uint8_t*,3> planes {
2288 std::chrono::milliseconds timecode = frame->
m_timecode;
2302 bool wantkeyframe = forcekey;
2304 bool writesync =
false;
2331 wantkeyframe =
true;
2347 mpa_picture->pict_type = AV_PICTURE_TYPE_I;
2349 mpa_picture->pict_type = AV_PICTURE_TYPE_NONE;
2353 AVPacket *packet = av_packet_alloc();
2354 if (packet ==
nullptr)
2356 LOG(VB_RECORD, LOG_ERR,
"packet allocation failed");
2359 packet->data = (uint8_t *)
m_strm;
2362 bool got_packet =
false;
2363 int ret = avcodec_receive_packet(
m_mpaVidCtx, packet);
2366 if (ret == AVERROR(EAGAIN))
2369 ret = avcodec_send_frame(
m_mpaVidCtx, mpa_picture);
2377 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"video encode error: %1 (%2)")
2379 av_packet_free(&packet);
2385 av_packet_free(&packet);
2391 av_packet_free(&packet);
2438 LOG(VB_GENERAL, LOG_ERR,
LOC +
"lzo compression failed");
2445 frameheader.
timecode = timecode.count();
2474 else if (compressthis == 0 || (
tmp < (
int)out_len))
2527 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"audio behind %1 %2").
2533 frameheader.
timecode = timecode.count();
2539 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
2540 QString(
"first timecode=%1").arg(
m_firstTc.count()));
2552 auto mt = (double)timecode.count();
2562 std::array<uint8_t,7200> mp3gapless {};
2563 int compressedsize = 0;
2564 int gaplesssize = 0;
2569 #if (Q_BYTE_ORDER == Q_BIG_ENDIAN)
2570 auto buf16 =
reinterpret_cast<uint16_t *
>(buf);
2572 buf16[i] = qToLittleEndian<quint16>(buf16[i]);
2576 lameret = lame_encode_buffer_interleaved(
2577 m_gf, (
short int*) buf, sample_cnt,
2582 lameret = lame_encode_buffer(
2583 m_gf, (
short int*) buf, (
short int*) buf, sample_cnt,
2589 LOG(VB_GENERAL, LOG_ERR,
LOC +
2590 QString(
"lame error '%1'").arg(lameret));
2591 m_error = QString(
"Audio Encoding Error '%1'")
2595 compressedsize = lameret;
2597 lameret = lame_encode_flush_nogap(
m_gf, mp3gapless.data(), mp3gapless.size());
2600 LOG(VB_GENERAL, LOG_ERR,
LOC +
2601 QString(
"lame error '%1'").arg(lameret));
2602 m_error = QString(
"Audio Encoding Error '%1'")
2606 gaplesssize = lameret;
2609 frameheader.
packetlength = compressedsize + gaplesssize;
2633 LOG(VB_RECORD, LOG_INFO,
LOC +
"audio behind");
2651 frameheader.
timecode = timecode.count();
2660 struct { int8_t m_a,m_b,m_c,m_d; } m_val8;