Update of /cvsroot/dirac/compress/libdirac_encoder
In directory
sc8-pr-cvs12.sourceforge.net:/tmp/cvs-serv21302/libdirac_enc
oder
Modified Files:
dirac_encoder.cpp dirac_encoder.h seq_compress.cpp
seq_compress.h
Log Message:
Fixed Bug #1874587 where not all frames loaded into the
encoder were not
being processed in Long GOP mode. The encoder now processes
all frames loaded.
The encoder API has also been modified ensure that all
encoded frames can
bre retrieved.
Index: seq_compress.h
============================================================
=======
RCS file:
/cvsroot/dirac/compress/libdirac_encoder/seq_compress.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** seq_compress.h 31 Jan 2008 11:25:18 -0000 1.20
--- seq_compress.h 6 Mar 2008 08:04:01 -0000 1.21
***************
*** 141,144 ****
--- 141,146 ----
bool Finished(){return m_all_done;}
+ //! Signal end of sequence
+ void SignalEOS() { m_eos_signalled = true; }
protected:
***************
*** 174,177 ****
--- 176,181 ----
//! Compress the picture using constant bit rate
coding. Purely virtual. The child class will have to define
it.
virtual void RateControlCompress(Picture&
my_picture, bool is_a_cut) = 0;
+ //! Returns true if the encoder can encode a
picture
+ bool CanEncode();
//! Completion flag, returned via the Finished
method.
***************
*** 230,233 ****
--- 234,240 ----
DiracByteStream& m_dirac_byte_stream;
+ //! Flag to check if End of Sequence has been
signalled by the end user
+ bool m_eos_signalled;
+
private:
//! Copy constructor is private and body-less
Index: dirac_encoder.h
============================================================
=======
RCS file:
/cvsroot/dirac/compress/libdirac_encoder/dirac_encoder.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** dirac_encoder.h 31 Jan 2008 11:25:18 -0000 1.20
--- dirac_encoder.h 6 Mar 2008 08:04:01 -0000 1.21
***************
*** 86,92 ****
dirac_encoder_state_t state;
!
! while (read uncompressed frame data into buffer)
{
// load one frame of data into encoder
if (dirac_encoder_load(encoder, buffer, buffer_size)
== 0)
--- 86,98 ----
dirac_encoder_state_t state;
! int go = 1;
! do
{
+ read uncompressed frame data into buffer
+ if (end of file)
+ {
+ // push end of sequence
+ dirac_encoder_end_sequence(encoder);
+ }
// load one frame of data into encoder
if (dirac_encoder_load(encoder, buffer, buffer_size)
== 0)
***************
*** 107,110 ****
--- 113,122 ----
case ENC_STATE_BUFFER:
break;
+ case ENC_STATE_EOS:
+ // Reached end of sequence
+ // End of sequence information is
available in encoder->enc_buf
+ // Sequence statistics available in
encoder->enc_seqstats;
+ go = 0; // exit from the encoding loop
+ break;
case ENC_STATE_INVALID:
default:
***************
*** 126,136 ****
} while (state == ENC_STATE_AVAIL)
}
! }
! // Retrieve end of sequence info
! encoder->enc_buf.buffer = video_buf;
! encoder->enc_buf.size = VIDEO_BUFFER_SIZE;
! dirac_encoder_end_sequence( encoder );
! // End of sequence info is availale in
encoder->enc_buf
! // Sequence statistics available in
encoder->enc_seqstats;
// Free the encoder resources
--- 138,142 ----
} while (state == ENC_STATE_AVAIL)
}
! } while (go == 1);
// Free the encoder resources
***************
*** 151,155 ****
ENC_STATE_INVALID = -1,
ENC_STATE_BUFFER,
! ENC_STATE_AVAIL
} dirac_encoder_state_t ;
--- 157,162 ----
ENC_STATE_INVALID = -1,
ENC_STATE_BUFFER,
! ENC_STATE_AVAIL,
! ENC_STATE_EOS
} dirac_encoder_state_t ;
***************
*** 430,448 ****
encoder. The encoder buffer enc_buf in the encodermust
be
set up with the buffer and buffer_size that will hold
the encoded frame
! param encoder Encoder Handle
! return ENC_STATE_INVALID -
unrecoverable error
! ENC_STATE_BUFFER - load data
into encoder
! ENC_STATE_AVAIL - Encoded
frame available
*/
extern DllExport dirac_encoder_state_t
dirac_encoder_output (dirac_encoder_t *encoder);
/*!
! Retrieve end of sequence information from the encoder.
The encoder buffer,
! enc_buf, in the encodermust be set up with the buffer
and
! buffer_size that will hold the end of sequence
information.
param encoder Encoder Handle
- return return status. >=0 -
successful; -1 failed
*/
! extern DllExport int dirac_encoder_end_sequence
(dirac_encoder_t *encoder);
/*!
--- 437,453 ----
encoder. The encoder buffer enc_buf in the encodermust
be
set up with the buffer and buffer_size that will hold
the encoded frame
! param encoder Encoder Handle
! return ENC_STATE_INVALID - unrecoverable
error
! ENC_STATE_BUFFER - load data into
encoder
! ENC_STATE_AVAIL - Encoded frame
available
! ENC_STATE_EOS - End of
Sequence info available
*/
extern DllExport dirac_encoder_state_t
dirac_encoder_output (dirac_encoder_t *encoder);
/*!
! Request the encoder to end the sequence.
param encoder Encoder Handle
*/
! extern DllExport void dirac_encoder_end_sequence
(dirac_encoder_t *encoder);
/*!
Index: dirac_encoder.cpp
============================================================
=======
RCS file:
/cvsroot/dirac/compress/libdirac_encoder/dirac_encoder.cpp,v
retrieving revision 1.42
retrieving revision 1.43
diff -C2 -d -r1.42 -r1.43
*** dirac_encoder.cpp 8 Feb 2008 13:57:16 -0000 1.42
--- dirac_encoder.cpp 6 Mar 2008 08:04:01 -0000 1.43
***************
*** 247,250 ****
--- 247,256 ----
const SourceParams& GetSrcParams() const { return
m_srcparams; }
+ // Signal End of Sequence
+ void SignalEOS() { m_eos_signalled = true;
m_seqcomp->SignalEOS(); }
+
+ // End of Sequence
+ bool EOS() { return m_eos_signalled == true; }
+
private:
***************
*** 316,319 ****
--- 322,329 ----
dirac_enc_picstats_t m_field1_stats;
+ // End of sequence flag. Set to true when user app
signals end of
+ // sequence
+ bool m_eos_signalled;
+
};
***************
*** 415,419 ****
m_gop_bits(0),
m_gop_count(0),
! m_picture_count(0)
{
// Setup source parameters
--- 425,430 ----
m_gop_bits(0),
m_gop_count(0),
! m_picture_count(0),
! m_eos_signalled(false)
{
// Setup source parameters
***************
*** 1037,1040 ****
--- 1048,1052 ----
try
{
+ // Get the next compressed picture
if (compressor->CompressNextPicture() != 0)
{
***************
*** 1050,1053 ****
--- 1062,1075 ----
}
}
+ else
+ {
+ // check if EOS has been signalled by the user
app
+ if (compressor->EOS())
+ {
+ compressor->GetSequenceEnd (encoder);
+ encoder->end_of_sequence = 1;
+ ret_stat = ENC_STATE_EOS;
+ }
+ }
if (encoder->enc_ctx.decode_flag)
compressor->GetDecodedData(encoder);
***************
*** 1063,1072 ****
}
! extern DllExport int dirac_encoder_end_sequence
(dirac_encoder_t *encoder)
{
TEST (encoder != NULL);
TEST (encoder->compressor != NULL);
DiracEncoder *compressor = (DiracEncoder
*)encoder->compressor;
- int ret_stat;
encoder->encoded_frame_avail = 0;
--- 1085,1093 ----
}
! extern DllExport void dirac_encoder_end_sequence
(dirac_encoder_t *encoder)
{
TEST (encoder != NULL);
TEST (encoder->compressor != NULL);
DiracEncoder *compressor = (DiracEncoder
*)encoder->compressor;
encoder->encoded_frame_avail = 0;
***************
*** 1074,1094 ****
encoder->instr_data_avail = 0;
! try
! {
! ret_stat = compressor->GetSequenceEnd
(encoder);
! encoder->end_of_sequence = 1;
- if (compressor->GetDecodedData(encoder))
- {
- encoder->decoded_frame_avail = 1;
- }
- }
- catch (...)
- {
- if (compressor->GetEncParams().Verbose())
- std::cerr << "GetSequenceEnd
failed..." << std::endl;
- ret_stat = -1;
- }
- return ret_stat;
}
--- 1095,1100 ----
encoder->instr_data_avail = 0;
! compressor->SignalEOS();
}
Index: seq_compress.cpp
============================================================
=======
RCS file:
/cvsroot/dirac/compress/libdirac_encoder/seq_compress.cpp,v
retrieving revision 1.51
retrieving revision 1.52
diff -C2 -d -r1.51 -r1.52
*** seq_compress.cpp 15 Feb 2008 01:47:09 -0000 1.51
--- seq_compress.cpp 6 Mar 2008 08:04:01 -0000 1.52
***************
*** 58,62 ****
m_qmonitor( m_encparams ),
m_pcoder( m_encparams ),
! m_dirac_byte_stream(dirac_byte_stream)
{
// Set up the compression of the sequence
--- 58,63 ----
m_qmonitor( m_encparams ),
m_pcoder( m_encparams ),
! m_dirac_byte_stream(dirac_byte_stream),
! m_eos_signalled(false)
{
// Set up the compression of the sequence
***************
*** 173,176 ****
--- 174,236 ----
}
+ bool SequenceCompressor::CanEncode()
+ {
+ if (m_eos_signalled)
+ {
+ /*
+ * Encode the remaining picture in the frame
buffer. We check if the
+ * reference pictures are available and modify the
picture sort
+ * accordingly.
+ */
+ if (m_current_code_pnum <=
m_last_picture_read)
+ {
+ m_current_display_pnum = m_current_code_pnum;
+ Picture& fbuf_picture =
m_fbuffer->GetPicture( m_current_display_pnum );
+ PictureParams& fbuf_pparams =
fbuf_picture.GetPparams();
+ Picture& me_picture =
m_mebuffer->GetPicture( m_current_display_pnum );
+ PictureParams& me_pparams =
me_picture.GetPparams();
+ // If INTRA pic, no further checks necessary
+ if (fbuf_pparams.PicSort().IsIntra())
+ return true;
+
+ // Bit of a hack since same frame info is
available in two different
+ // buffers - decoded pic buffer and motion
estimation buffer.
+ std::vector<int>& fbuf_refs =
fbuf_pparams.Refs();
+ std::vector<int>& me_refs =
me_pparams.Refs();
+ int num_refs = 0;
+ if
(m_fbuffer->IsPictureAvail(fbuf_refs[0]))
+ ++num_refs;
+ if (fbuf_refs.size() > 1)
+ {
+ if
(m_fbuffer->IsPictureAvail(fbuf_refs[1]))
+ {
+ if (num_refs == 0)
+ {
+ fbuf_refs[0] = fbuf_refs[1];
+ me_refs[0] = me_refs[1];
+ }
+ ++num_refs;
+ }
+ }
+ fbuf_refs.resize(num_refs);
+ me_refs.resize(num_refs);
+
+ if (fbuf_refs.size() == 0)
+ {
+ fbuf_picture.SetPictureSort
(PictureSort::IntraNonRefPictureSort());
+ me_picture.SetPictureSort
(PictureSort::IntraNonRefPictureSort());
+ }
+
+ return true;
+ }
+ }
+ else
+ {
+ if (m_last_picture_read >=
m_current_display_pnum)
+ return true;
+ }
+ return false;
+ }
+
Picture& SequenceCompressor::CompressNextPicture()
{
***************
*** 194,204 ****
m_show_pnum = std::max( m_current_code_pnum - m_delay
, 0 );
! // Flag saying we're ready to encode
! bool can_encode = false;
!
! if (m_last_picture_read >= m_current_display_pnum
)
! can_encode = true;
!
! if ( can_encode )
{ // We haven't coded everything, so compress the
next picture
--- 254,258 ----
m_show_pnum = std::max( m_current_code_pnum - m_delay
, 0 );
! if ( CanEncode() )
{ // We haven't coded everything, so compress the
next picture
------------------------------------------------------------
-------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
a>
_______________________________________________
Dirac-commits mailing list
Dirac-commits lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dirac-com
mits
|